类似于对象的宏定义以左paren开头

时间:2015-04-04 21:23:31

标签: c macros c-preprocessor standards c11

抢先注意:我知道lparen被定义为" (字符不会紧跟white-space"并且可以通过将宏定义更改为#define FOO (来轻松解决这个问题。从实施 C 预处理器的人的角度来看,这是一个迂腐的问题。

#define FOO(
int main FOO) {
    return 0;
}

我对C11标准的阅读让我觉得这是一个有效的程序,其中定义了一个名为FOO的类似对象的宏,其中包含一个由单个(预处理令牌组成的替换列表

6.10.3p9:

  

表单的预处理指令   # define identifier replacement-list new-line定义了一个类似对象的宏

6.10.3p10:

  

表单

的预处理指令      

# define identifier lparen identifier-list_opt ) replacement-list new-line

     

# define identifier lparen ... ) replacement-list new-line

     

# define identifier lparen identifier-list , ... ) replacement-list new-line

     

定义了一个类似函数的宏

clang 3.5和gcc 4.9都拒绝这个程序,显然认为FOO是一个不正常的函数式宏定义。我是否错过了标准中的明确规则,即lparen项上的匹配强制将宏定义视为类似函数的宏,或者这是两个编译器中的错误?我希望将其解析为类似对象的宏,因为它与类似函数的宏的语法不匹配。

1 个答案:

答案 0 :(得分:2)

§6.10.3宏替换

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