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

时间:2019-02-01 09:17:42

标签: 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;
}

当没有使用gcc编译器设置ENABLE_SOMETHING时(也许有一些标志),是否可以捕获错误/警告?或者也许我可以使用外部工具?


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

#ifndef ENABLE_SOMETHING
    #error "ENABLE_SOMETHING undefined!"
#endif

但是我在代码中有大量不同的定义(ENABLE_STH1ENABLE_STH2ENALBE_STH3 ...等),我不想手动解决。我正在为我们的项目寻找一些自动解决方案。

4 个答案:

答案 0 :(得分:3)

  

当未设置ENABLE_SOMETHING时是否有一种捕获错误/警告的方法   使用gcc编译器(也许有一些标志)?

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

From the official documentation

  

-Wundef

     

警告是否在#if指令中评估未定义的标识符。此类标识符将替换为零。

编辑:

例如,此C代码:

#include <stdio.h>

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

  return 0;
}

...使用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
     ^

答案 1 :(得分:0)

让我们假设您具有这段代码并且可以编译,但是您不知道MAX_N_LENGTH是宏还是其他宏:

int main()
{
    int a = MAX_N_LENGTH; // MAX_N_LENGTH could also be an int declared somewhere else
    return 0;
}

您可以检查它是否实际上是这样的宏:

#ifdef MAX_N_LENGTH
    printf("MAX_N_LENGTH is a macro.\n");
#else
    printf("MAX_N_LENGTH is NOT macro.\n");
#endif // MAX_N_LENGTH

当然,如果有什么问题,我会重新考虑我的命名约定。

答案 2 :(得分:0)

您可以尝试以下操作:

#ifndef MAX_N_LENGTH
#warning "MAX_N_LENGTH is undefined"
    int array[16];
#else
    int array[MAX_N_LENGTH + 1];
#endif

答案 3 :(得分:0)

您可以使用#if测试defined(ENABLE_SOMETHING)预处理程序表达式中是否定义了宏:

#if !defined(ENABLE_SOMETHING)
  #error ENABLE_SOMETHING is not defined
#endif

您可以通过以下方式处理具有空定义的宏:

#if ENABLE_SOMETHING + 0 == 1
   /* ENABLE_SOMETHING is defined and not 0 or empty */
#endif