2013-12-11 59 views
3
#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 
+2

这不是标准的语法,所以可能是某种编译器扩展等。你知道该库的作者使用哪个编译器吗? – sth

+0

我不确定作者是否使用了特殊的东西来编译。但如果gcc无法识别宏,它不应该抛出错误而不是警告? – Jean

+1

它是有效的代码(宏'DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__'扩展为'[0,2] 1'),所以它不会是一个错误,但它看起来很奇怪(有人认为他们可以制作一个宏,它将括号中的参数?)尽管我注意到用'-std = c99'这个警告特别说明了“ISO C99需要宏名后面的空格”......所以也许这就是C89和C99之间的区别? –

回答

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

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

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

它使上述定义无效(需要诊断的约束冲突)。在宏名称后添加一个空格:

#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__ [0, 2] 1 

会使警告无效,但这不太可能是正确的解决方法。

看起来像的意图是允许宏的用途使用[]用于一些特殊用途,但是这不是标准的语言支持。它可能可能是一个特定于编译器的扩展,但它不是我遇到过的,我可能不会推荐使用它。

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