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

时间:2012-03-14 00:24:54

标签: c gcc macros c-preprocessor pragma

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

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

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

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

导致:

  

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

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

2 个答案:

答案 0 :(得分:25)

要显示非字符串的宏stringify the macro

#define STRINGIFY(s) XSTRINGIFY(s)
#define XSTRINGIFY(s) #s

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

如果您有/ boost,可以使用boost stringize为您执行此操作:

#include <boost/preprocessor/stringize.hpp>
#define ADEFINE 23
#pragma message ("ADEFINE=" BOOST_PP_STRINGIZE(ADEFINE))

答案 1 :(得分:6)

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

// test.c
#include <stdlib.h>
#include <stdio.h>
#define ADEFINE "23"
#include <string.h>

int main(int argc, char *argv[])
{
#undef ADEFINE
#define ADEFINE 42
    return 0;
}

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

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