从宏警告

时间:2013-12-11 15:53:55

标签: c++ c gcc macros g++

#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__[0, 2] 1

warning: missing whitespace after the macro name [enabled by default]

我正在尝试编译第三方头文件,而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

1 个答案:

答案 0 :(得分:2)

#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__[0, 2] 1

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

#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__ [ 0 , 2] 1

以便DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__的任何使用扩展到[0, 2] 1。 (这甚至不可能有意义; C不允许[...]内的多个索引表达式,而0, 2将被解释为等同于2的逗号表达式。)< / p>

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

  

定义中的标识符和替换列表之间应该有空格   一个类似对象的宏。

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

#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__ [0, 2] 1

会使警告静音,但这不太可能是正确的修复。

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

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