2015-04-04 20 views
0

优先注意:我知道lparen被定义为“(字符不是前面紧接着white-space”,这可以通过将宏定义更改为#define FOO ( 。从执行预处理器的人的角度来看,这是一个迂腐的问题。类似于宏的定义从左开始

#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

限定函数宏

两个铛3.5和gcc 4.9拒绝该程序,显然考虑FOO是一个不适形成功能类似的宏定义。我错过了标准中明确的规则:lparen术语中的匹配强制宏定义被视为类似函数的宏,或者这是两个编译器中的错误吗?我希望这被解析为一个类似宏的对象,因为它不匹配类似函数宏的语法。

回答

2

§6.10.3宏替换

  • 须有所述标识符和在类似对象的宏的定义替换列表之间的空白。