如何在编译时从文本块中创建一系列32位字

问题描述:

C新手在这里 - 我正在使用嵌入式设备,并希望通过特定的协议传输ASCII字符的'页面'。如何在编译时从文本块中创建一系列32位字

该协议强制传输32位字的2个字符(特别是位位置)。这个词的其余部分被用于其他目的。

而不是定义一个页面,如

MY_PAGE { 
{ WHATEVER, 'H', 'E', BAR} // word 1 
{ WHATEVER, 'L', 'L', BAR} //word 2 
{ WHATEVER, 'O', NUL, BAR} // word 3 
} 

为了清楚,我想简单地指定“你好”,让宏手柄的数据字的组装来实现这一目标。它比它的价值更麻烦吗?

对于运行时解决方案,我只是解析一个字符串文字并在内存中构建一些东西。

谢谢!

我会在编译时使用脚本语言来生成数据。选择你的选择,但蟒蛇非常适合这样的事情:

sourcefile = open ("page.src") 
generatedfile = open("page.out", "w") 

# Do whatever processing you need to generate 
# code from your source data that will be read by the c-compiler eg 

dat = sourcefile.read(2) 
generatedfile.write("{FOO, %s, %s, BAR}" %(dat[0], dat[1])) 
#etc 

现在包括生成的文件在C源

#include "page.out" 

为了使您的脚本文件更简单,确保任何代码,可以包含在C文件包含在C文件,而不是在生成的文件,例如:

struct _page pagedata = { 
#include "page.out" 
}; 

作为一个真实的例子,我已经在过去做到了这一点,像这样

const char * fpga_data = { 
#include "comma_separated_byte_values.inc" 
}; 

如果您使用的是make文件,告诉它page.out取决于page.src和你的Python脚本,你的目标文件依赖于page.out:

page.out: page.src processpage.py 
    python processpage.py 

main.o: main.c page.out 
    $cc main.c 
+0

有趣!从未想过在预处理器之外使用python或其他任何东西......真的非常感谢您 – user3457614

听起来更像是一个运行时功能的工作,而不是一个真实的宏。你可以有不同的字符串常量和其他东西,并在出路时将它们组装起来。这也将你的存储从你的传输中解耦出来,根本不必是同一个东西,也可能不应该。

+0

我一般都认同,虽然我基于我的回答假设有一个原因,OP需要在编译时进行此操作。例如,系统的占地面积可能很小? – Rodney