pro*_*key 8 c syntax grammar atomic c11
阅读第11页的C11标准的N1570草案。关于_Atomic关键字121:
如果_Atomic关键字后紧跟左括号,则将其解释为类型说明符(具有类型名称),而不是类型限定符。
现在我想知道,在这种情况下什么构成“即时”?
我发现措辞很含糊:标准是否保证以下两行代码始终相同?
明确的:
static _Atomic(type) var;
Run Code Online (Sandbox Code Playgroud)
暧昧:
static _Atomic (type) var;
Run Code Online (Sandbox Code Playgroud)
插入空格是否会破坏左括号的直接性?
在第一种情况下,关键字始终是类型说明符,而在第二种情况下,我不确定它是类型说明符还是类型限定符,并且不确定是解释问题还是由标准明确定义。我还指的是“ var”是指针的情况。
Eri*_*hil 10
_Atomic
语法分别在第6.7.2.4节和6.7.3节中显示了作为类型说明符或类型限定符的名称。语法以记号表示(语法的末尾符号是C规范定义的记号),语法在翻译阶段7中进行分析(第5.1.1.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) ...'
Run Code Online (Sandbox Code Playgroud)
那是6.10.3,最容易理解的是按以下顺序阅读第9、10和3段:
[9]形式的预处理指令
Run Code Online (Sandbox Code Playgroud)# define identifier replacement-list new-line
定义一个类似对象的宏...
[10]一种形式的预处理指令
Run Code Online (Sandbox Code Playgroud)# define identifier lparen identifier-listopt ) replacement-list new-line [...two other forms...]
定义类似函数的宏...
[3]在类似对象的宏的定义中,标识符和替换列表之间应有空白。
从中可以得出的推论是,当C标准表示要在语法中赋予空白意义时,它会如此明确地指出。如果没有这样的显式语句,则可以假定是否存在空格仅在影响源文本如何划分标记时才有意义。