来自宏的警告

Jea*_*ean 5 c c++ macros gcc g++

#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__[0, 2] 1

warning: missing whitespace after the macro name [enabled by default]
Run Code Online (Sandbox Code Playgroud)

我试图编译第三方头文件,而 gcc 抛出此警告。我不确定这个宏是做什么的。它是定义以下内容的快捷方式吗?如何解决该警告?

#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__0 1
#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__1 1
#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__2 1
Run Code Online (Sandbox Code Playgroud)

Kei*_*son 2

#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__[0, 2] 1
Run Code Online (Sandbox Code Playgroud)

[在 C89/C90 中,这是一个有效的宏定义,但和字符没有什么特别的]。它定义了一个名为 的类似对象的宏DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__,其定义相当于:

#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__ [ 0 , 2] 1
Run Code Online (Sandbox Code Playgroud)

这样 的任何使用都会DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__扩展到[0, 2] 1. (这甚至可能没有意义;C 不允许 , 中存在多个索引表达式[...],并且0, 2将被解释为相当于 的逗号表达式2。)

C99添加了一条新规则(6.10.3p3):

在类对象宏的定义中,标识符和替换列表之间应有空格。

这使得上述定义无效(违反约束需要诊断)。在宏名称后添加一个空格:

#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__ [0, 2] 1
Run Code Online (Sandbox Code Playgroud)

会使警告静音,但这不太可能是正确的解决方案。

看起来目的是允许宏的使用和某些特殊目的但这不是标准语言支持的。它可能是一个特定于编译器的扩展,但我从未遇到过,而且我可能不建议使用它。[]

查看一些引用宏的代码可能会很有用。