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

Joh*_*den 23 c macros gcc pragma c-preprocessor

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

#define ADEFINE "23"
#pragma message ("ADEFINE" ADEFINE)
Run Code Online (Sandbox Code Playgroud)

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

#define ADEFINE 23
#pragma message ("ADEFINE" ADEFINE)
Run Code Online (Sandbox Code Playgroud)

原因:

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

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

rob*_*05c 26

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

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

#define ADEFINE 23
#pragma message ("ADEFINE=" STRINGIFY(ADEFINE))
Run Code Online (Sandbox Code Playgroud)

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

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

  • @JohnLawrenceAspden我更新了答案,没有提升(或任何其他库)如何做到这一点. (5认同)

Mic*_*urr 7

我不确定这是否能满足您的需求,但是如果您只对此感兴趣来调试偶然的宏问题(因此不需要在每次编译的消息中显示它),以下内容可能对您有用.使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

#define ADEFINE "23"
#undef ADEFINE
#define ADEFINE 42
Run Code Online (Sandbox Code Playgroud)