我有一个定义大量宏的标头,其中一些宏依赖于其他宏 - 但是,依赖关系都在此标头内解析。
我需要一个单行程序来打印出该标题中定义的宏的值。
举个例子:
#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
答案 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)