单行程序,用于从标题中打印出宏的值

时间:2011-09-08 19:44:47

标签: c header

我有一个定义大量宏的标头,其中一些宏依赖于其他宏 - 但是,依赖关系都在此标头内解析。

我需要一个单行程序来打印出该标题中定义的宏的值。

举个例子:

#define MACRO_A 0x60000000
#define MACRO_B MACRO_A + 0x00010000
//...

乍一看:

echo MACRO_B | ${CPREPROCESSOR} --include /path/to/header

......几乎给了我想要的东西:

# A number of lines that are not important
# ...
0x60000000 + 0x00010000

...但是,我试图让它不会膨胀到一个巨大的序列“管道它,然后把它管道......”。

我也试过这个:

echo 'main(){ printf( "0x%X", MACRO_B ); }' \
  | ${CPREPROCESSOR} --include /path/to/header --include /usr/include/stdio.h

...但它(gcc编译器)抱怨在标准输入上处理代码时需要-E,所以我最终必须写出一个临时文件来编译/运行它。

有更好的方法吗?

-Brian

5 个答案:

答案 0 :(得分:4)

echo 'void main(){ printf( "0x%X", MACRO_B ); }' \
  | gcc -x c --include /path/to/header --include /usr/include/stdio.h - && ./a.out

将在一行中完成。

(你误读了GCC从stdin读取时给出的错误。你需要-E-x(需要指定预期的语言))

此外,它是int main(),或者,当你不在乎这里时,只需完全删除返回类型。而且您无需指定stdio.h的路径。

稍短:

echo 'main(){printf("0x%X",MACRO_B);}' \
  | gcc -xc --include /path/to/header --include stdio.h - && ./a.out

答案 1 :(得分:1)

tail -n1怎么样?像这样:

$ echo C_IRUSR | cpp --include /usr/include/cpio.h | tail -n 1
000400

答案 2 :(得分:0)

如何人工生成包含MACRO_B值的错误,然后编译代码?

答案 3 :(得分:0)

我认为最简单的方法是编写一个小的C程序,包括标题,并打印所需的输出。然后你可以在你的脚本,makefile或其他任何东西中使用它。

答案 4 :(得分:0)

echo '"EOF" EOF' | cpp --include /usr/include/stdio.h | grep EOF

打印:

"EOF" (-1)