以左括号开头的类对象宏定义
Object-like macro definition starting with a left paren
先发制人注意:我知道 lparen
被定义为 "a (
character not immediately preceded by white-space
",这可以通过将宏定义更改为 #define FOO (
来轻松解决。从实施 C 预处理器的人的角度来看,这是一个迂腐的问题。
#define FOO(
int main FOO) {
return 0;
}
我对 C11 标准的阅读给我的印象是,这是一个有效的程序,其中定义了一个名为 FOO
的类似对象的宏,其中包含一个由单个 (
组成的替换列表预处理令牌。
6.10.3p9:
A preprocessing directive of the form
# define identifier replacement-list new-line
defines an object-like macro
6.10.3p10:
A preprocessing directive of the form
# 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
defines a function-like macro
clang 3.5 和 gcc 4.9 都拒绝这个程序,显然认为 FOO
是一个格式错误的类函数宏定义。我是否错过了标准中某个地方的明确规则,即匹配 lparen
术语会强制将宏定义视为类似函数的宏,或者这是两个编译器中的错误?我希望它被解析为类对象宏,因为它与类函数宏的语法不匹配。
§ 6.10.3 宏替换
- 在类对象宏的定义中,标识符和替换列表之间应有白色-space。
先发制人注意:我知道 lparen
被定义为 "a (
character not immediately preceded by white-space
",这可以通过将宏定义更改为 #define FOO (
来轻松解决。从实施 C 预处理器的人的角度来看,这是一个迂腐的问题。
#define FOO(
int main FOO) {
return 0;
}
我对 C11 标准的阅读给我的印象是,这是一个有效的程序,其中定义了一个名为 FOO
的类似对象的宏,其中包含一个由单个 (
组成的替换列表预处理令牌。
6.10.3p9:
A preprocessing directive of the form
# define identifier replacement-list new-line
defines an object-like macro
6.10.3p10:
A preprocessing directive of the form
# 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
defines a function-like macro
clang 3.5 和 gcc 4.9 都拒绝这个程序,显然认为 FOO
是一个格式错误的类函数宏定义。我是否错过了标准中某个地方的明确规则,即匹配 lparen
术语会强制将宏定义视为类似函数的宏,或者这是两个编译器中的错误?我希望它被解析为类对象宏,因为它与类函数宏的语法不匹配。
§ 6.10.3 宏替换
- 在类对象宏的定义中,标识符和替换列表之间应有白色-space。