从标头到shell获取define/const值?

从标头到shell获取define/const值?,c,shell,C,Shell,假设一个程序有一些头,如果通常编写一些C程序,那么它将包含-I/path/header.h。它有一堆#定义,其中一些是“复合的”,比如#定义一些常量,一些预处理函数(3),还有一些枚举 将SOME_CONST和SOME_ENUM的值放到一行中的好方法是什么?无需编写编译自定义可执行文件。不起作用的伪东西,但希望能说明这一点: ./$(cc '#include <header>\n#include <stdio>\nvoid main () {printf("%d\n",

假设一个程序有一些头,如果通常编写一些C程序,那么它将包含
-I/path/header.h
。它有一堆
#定义
,其中一些是“复合的”,比如
#定义一些常量,一些预处理函数(3)
,还有一些枚举

SOME_CONST
SOME_ENUM
的值放到一行中的好方法是什么?无需编写编译自定义可执行文件。不起作用的伪东西,但希望能说明这一点:

./$(cc '#include <header>\n#include <stdio>\nvoid main () {printf("%d\n", $const_or_enum_name);}' -I/path/header.h)
/$(cc'#include\n#include\nvoid main(){printf(“%d\n”、$const\u或_enum\u name);}'-I/path/header.h)

或者使用其他工具?

您可以执行预处理器步骤,然后停止。这可以使用
cc-E
完成

$ cat header.h
#define VAR 3
$ echo -e "#include \"header.h\"\nVAR" | cc -E -xc -
<lots of stuff>
3
$ echo -e "#include \"header.h\"\nVAR" | cc -E -xc - | tail -1
3

是的,constant/enum的值作为命令的输出返回。您的伪东西可能不是最好的方法,但它也不是一个坏主意。你试过了吗?您可以将源代码导入gcc,编译后必须运行可执行文件,但它应该可以工作;它必须是
int main
“一个将包含
-I/path/header.h
”-通常不是<代码>#建议在代码中包含ing标题。只需指出您正在过度且不相关地学习@Jens和Olaf,这是您已知的要点(除非在任何情况下,如果.h不在当前目录中,您都需要-I)和被问的问题无关。多行定义将作为单行连接-刚刚测试过。另一方面,这不会进行任何计算,因此,如果
VAR
是例如
VAL*other\u VAL
结果将类似于
3*5
是,计算问题有点麻烦,可能有人会以某种方式解决它。将不得不查找。似乎使用m4预处理器应该可以实现这一点,但将不得不进一步查看。因此,对于我的案例(有点复杂),bc不起作用,但执行
。\neval(VAR3)“cc-E-xc-| tail-1 | m4
工作。所有这些仍然会留下枚举…因为预处理器无法返回/知道枚举值。
$ cat header.h 
#define VAR1 3
#define VAR2 5
#define VAR3 VAR1*VAR2
$ echo -e "#include \"header.h\"\nVAR3" | cc -E -xc - | tail -1 | bc
15