如何捕获预处理器 #if 条件中未定义的宏?

s.p*_*zko 10 c gcc c-preprocessor

基于这个问题How to catch empty Defined Macro with gcc? 我还有另一个问题。如何在预处理器#if条件下捕获未定义的宏?示例代码:

#include <stdio.h> 

int main()
{
#if ENABLE_SOMETHING == 1
    ... do something ..
#endif
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

ENABLE_SOMETHING当未使用 gcc 编译器(可能是某个标志)设置时,有没有办法捕获错误/警告?或者也许有我可以使用的外部工具?


我知道我可以写这样的东西:

#ifndef ENABLE_SOMETHING
    #error "ENABLE_SOMETHING undefined!"
#endif
Run Code Online (Sandbox Code Playgroud)

但我在代码中有大量不同的定义(ENABLE_STH1、、...等),我不想手动修复这个问题ENABLE_STH2ENALBE_STH3我正在为我们的项目寻找一些自动解决方案。

Mor*_*sen 10

当未使用 gcc 编译器设置 ENABLE_SOMETHING 时(可能是某个标志),有没有办法捕获错误/警告?

使用 GCC,您可以使用该-Wundef标志。

来自官方文档

-温德夫

如果在 #if 指令中计算未定义的标识符,则发出警告。此类标识符被替换为零。

编辑:

例如,这个 C 代码:

#include <stdio.h>

int main(void)
{
#if UNDEFINED_MACRO
  printf("hi mum!\n");
#endif

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

...使用 GCC 和 -Wundef 标志编译会产生以下结果:

$ gcc undef.c -Wundef
undef.c: In function 'main':
undef.c:5:5: warning: "UNDEFINED_MACRO" is not defined [-Wundef]
 #if UNDEFINED_MACRO
     ^
Run Code Online (Sandbox Code Playgroud)