【问题标题】:Does the C11 keyword '_Atomic' count as type qualifier or specifier if followed by a whitespace and a left parenthesis?如果后跟空格和左括号,C11 关键字“_Atomic”是否算作类型限定符或说明符?
【发布时间】:2019-07-15 20:01:01
【问题描述】:

阅读 C11 标准的 N1570 草案,它在第 p. 121关于_Atomic关键字:

如果 _Atomic 关键字后面紧跟一个左括号, 它被解释为类型说明符(带有类型名称),而不是 类型限定符。

现在我想知道,在这种情况下,什么构成“立即”?

我觉得措辞很模棱两可: 标准是否保证以下两行代码始终相同?

明确:

static _Atomic(type) var;

模棱两可:

static _Atomic (type) var;

插入空格是否会破坏左括号的直接性?

虽然在第一种情况下,关键字始终是类型说明符,但在第二种情况下,我不确定它是类型说明符还是类型限定符,以及这是解释问题还是标准严格定义的问题。我还指的是 'var' 是指针的情况。

【问题讨论】:

  • 我没有参考标准来支持这一点,但我认为“立即”意味着“下一个标记”,而不是下一个字符。

标签: c syntax grammar atomic c11


【解决方案1】:

_Atomic 作为类型说明符或类型限定符分别显示在第 6.7.2.4 和 6.7.3 节的语法中。文法用记号表示(文法的终结符是C规范定义的记号),在翻译阶段7分析文法(5.1.1.2):

分隔标记的空白字符不再重要。每个预处理令牌都被转换为一个令牌。生成的标记在句法和语义上进行分析并作为翻译单元进行翻译。

因此,空白是无关紧要的。

【讨论】:

  • 这里提醒编译器使用“as-if rule”。该标准规定每个解析阶段都一次完成,即使实际实现延迟它们。
  • @o11c:这与这里无关。
【解决方案2】:

你的两行代码是一样的; “紧随其后”是指下一个阶段 7 标记,而不是源文件中的下一个字符。

我不相信这在任何地方都明确说明过,但是比较 C 中标识符和左括号之间存在或不存在空格的一个地方的规范是有启发性的确实控制两个语法规则中的哪一个适用:

#define foo(bar) ...  // defines function-like macro 'foo(bar)' with replacement '...'
#define foo (bar) ... // defines object-like macro 'foo' with replacement '(bar) ...'

那是6.10.3,通过按顺序阅读第 9、10 和 3 段最容易理解

[9] 形式的预处理指令

# define identifier replacement-list new-line

定义一个类似对象的宏...

[10] 形式[s]的预处理指令

# define identifier lparen identifier-listopt ) replacement-list new-line
[...two other forms...] 

定义了一个类似函数的宏...

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

您可以从中得出的推论是,当 C 标准意味着在语法中赋予空白意义时,它明确表示。如果没有这样的明确声明,您可以假设空格的存在与否仅在影响源文本如何划分为标记时才有意义。

【讨论】:

  • 谢谢,这是一个有趣的例子。对我来说,您的答案与 Eric Postpischil 给出的答案一样好,但不幸的是,我只能选择一个作为接受的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 2021-01-05
  • 2012-11-26
  • 1970-01-01
相关资源
最近更新 更多