优先注意:我知道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
术语中的匹配强制宏定义被视为类似函数的宏,或者这是两个编译器中的错误吗?我希望这被解析为一个类似宏的对象,因为它不匹配类似函数宏的语法。