如果C11关键字“ _Atomic”后接空格和左括号,是否算作类型限定符或说明符?

时间:2019-07-15 20:01:01

标签: c atomic c11 stdatomic

在阅读p11上说,它阅读了C11标准的N1570草案。关于_Atomic关键字121:

  

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

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

我发现措辞很含糊: 该标准是否保证以下两行代码始终相同?

明确:

static _Atomic(type) var;

A昧:

static _Atomic (type) var;

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

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

2 个答案:

答案 0 :(得分:10)

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

  

用于分隔标记的空格字符不再重要。每个预处理令牌都将转换为令牌。对生成的令牌进行语法和语义分析,并将其作为翻译单元进行翻译。

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

答案 1 :(得分:6)

您的两行代码是相同的; “紧随其后”是指下一个阶段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]一种形式的预处理指令

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

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

     

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

您可以从中得出的推论是,当C标准表示要在语法中赋予空白含义时,它会如此明确地指出。如果没有这样的明确声明,则可以假定是否存在空格仅在影响到源文本如何划分标记时才有意义。