如何知道预处理器使用的标志(如#ifdef或#if)是否确实已定义

时间:2014-10-16 20:31:33

标签: c c-preprocessor

我正在深入研究glibc源代码,发现了很多预处理器的用法,比如

#ifdef XXX

#if YYY

为了知道将在我的机器上编译和运行的glibc的确切行为,我必须知道这些标志是否确实已定义。我目前正在做的是将以下代码插入到某处,编译和运行,这既不优雅也不高效。

#ifdef XXX
printf("XXX defined");
#endif

另一种方式可能是grep整个源代码树中的标志,但我发现这种方式不太可靠。因为有时候我找不到任何#define XXX,但我仍然打印出XXX defined。 (任何人都可以让我知道为什么吗?)

因此,我想知道这样做的最佳做法是什么。

1 个答案:

答案 0 :(得分:2)

我发现gcc-g3gdb的组合对于检查宏,甚至宏函数宏扩展非常有用。有关详细信息,请参阅GDB手册中的man gcc12 C Preprocessor Macros

随着更多"侵入性"您可以在编译期间使用#pragma message(或类似的)指令来检查单个宏:

  

在编译时将字符串打印为编译器消息。信息是   仅供参考,既不是编译警告也不是错误。

还有-E开关,可以简单地查看预处理的翻译单元。