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

问题描述 投票:0回答:4

基于这个问题如何用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_STH1
ENABLE_STH2
ENALBE_STH3
...等),我不想手动修复这个问题。我正在为我们的项目寻找一些自动解决方案。

c gcc c-preprocessor
4个回答
11
投票

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

使用 GCC,您可以使用

-Wundef
标志(clang 也支持它)。

来自官方文档

-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
     ^

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

当然,如果这是一个问题,我会重新考虑我的命名约定。


0
投票

您可以尝试以下操作:

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

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
© www.soinside.com 2019 - 2024. All rights reserved.