如何在编译时在gcc中显示#define的值

到目前为止,我已经达到了:

#define ADEFINE "23" #pragma message ("ADEFINE" ADEFINE) 

哪个有效,但是如果ADEFINE不是字符串怎么办?

 #define ADEFINE 23 #pragma message ("ADEFINE" ADEFINE) 

原因:

警告:格式错误的’#pragma message’,被忽略

理想情况下,我希望能够处理任何值,包括undefined。

要显示非字符串的宏 ,请对宏进行字符串化 :

 #define STRINGIFY(s) XSTRINGIFY(s) #define XSTRINGIFY(s) #s #define ADEFINE 23 #pragma message ("ADEFINE=" STRINGIFY(ADEFINE)) 

如果你有/想要提升 ,你可以使用boost stringize为你做:

 #include  #define ADEFINE 23 #pragma message ("ADEFINE=" BOOST_PP_STRINGIZE(ADEFINE)) 

我不确定这是否能满足您的需求,但是如果您只对此感兴趣来调试偶然的宏问题(因此不需要在每次编译的消息中显示它),以下内容可能对您有用。 使用gcc的-E -dD选项转储#define指令以及预处理输出。 然后通过grep管道只能看到你想要的行:

 // test.c #include  #include  #define ADEFINE "23" #include  int main(int argc, char *argv[]) { #undef ADEFINE #define ADEFINE 42 return 0; } 

命令gcc -E -dD -c test.c | grep ADEFINE gcc -E -dD -c test.c | grep ADEFINE显示:

 #define ADEFINE "23" #undef ADEFINE #define ADEFINE 42