#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
最佳答案
#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
。)
C99 添加了一条新规则 (6.10.3p3):
There shall be white-space between the identifier and the replacement list in the definition of an object-like macro.
这使得上述定义无效(约束违规 需要诊断)。在宏名后加一个空格:
#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__ [0, 2] 1
会使警告静音,但这不太可能是正确的解决方法。
它看起来的目的是允许使用宏来将[
和]
用于某些特殊目的,但这不是什么标准语言支持。它可能是特定于编译器的扩展,但我从未遇到过,我可能不建议使用它。
查看一些引用宏的代码可能会有用。
关于c++ - 来自宏的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20523772/