【问题标题】:Object-like macro definition starting with a left paren以左括号开头的类对象宏定义
【发布时间】:2015-04-04 21:23:31
【问题描述】:

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

【问题讨论】:

    标签: c macros c-preprocessor standards c11


    【解决方案1】:

    § 6.10.3 宏替换

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-29
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多