c - 以左括号开头的类对象宏定义

标签 c macros c-preprocessor standards c11

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

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

我对 C11 标准的阅读给我的印象是,这是一个有效的程序,其中一个名为 FOO 的类对象宏定义了一个由单个 ( 预处理 token 。

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 宏替换

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

关于c - 以左括号开头的类对象宏定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29451545/

相关文章:

c++ - 如何自动创建具有最新编译时间的文件并将其包含到库中?

c++ - 将 Lua 与 Visual Studio 2010 链接起来

c - C 中用于替换另一个宏中的参数的宏

macros - 在交换中调用带有字符串的 Clojure 函数?

vim - 使用 VIM 映射模拟元胞自动机?

objective-c - Xcode 预处理器输出

c++ - #define 带有 L 标识符的语法

c - 如何检查 Gtk ListStore 中是否已存在值以避免重复?