阅读了N1570标准的C11草案,在第121页中提到了_Atomic关键字:
如果_Atomic关键字后面紧跟着左括号,则它被解释为类型说明符(带有类型名称),而不是类型限定符。
现在我想知道,在这种情况下,什么是“立即”?
我发现这个措辞非常模糊:标准保证的以下两行代码始终是相同的吗?
毫不含糊的:
static _Atomic(type) var;含糊不清:
static _Atomic (type) var;空格的插入会破坏左括号的即时性吗?
在第一种情况下,关键字始终是类型说明符,而在第二种情况下,我不确定它是类型说明符还是类型限定符,以及这是一个解释问题还是标准明确定义的问题。我还指的是“var”是指针的情况。
发布于 2019-07-15 20:10:44
_Atomic作为类型说明符或类型限定符分别显示在6.7.2.4和6.7.3小节的语法中。语法用标记表示(语法的末端符号是C规范定义的标记),语法在翻译阶段7中进行分析(第5.1.1.2条):
分隔标记的空白字符不再重要。每个预处理令牌被转换为令牌。生成的标记在语法和语义上进行分析,并作为翻译单元进行翻译。
因此,空白是不相关的。
发布于 2019-07-15 20:28:23
您的两行代码是相同的;“立即”表示下一个阶段7标记,而不是源文件中的下一个字符。
我不认为这一点在任何地方都有明确的表述,但是比较C中的一个位置的规范是有指导意义的,在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表单定义标识符替换-列表新行的预处理指令定义了一个类似对象的宏. 10格式的预处理指令-定义标识符lparen标识符-listopt)替换列表新行...two其他形式.定义一个类似函数的宏. 3在类对象宏的定义中,标识符和替换列表之间应有空白。
由此可以得出的推论是,当C标准意味着在语法中赋予空格的意义时,它会明确地这样说。当没有这样的显式语句时,您可以假设空白的存在或不存在只有在影响源文本如何被划分为标记时才是重要的。
https://stackoverflow.com/questions/57046444
复制相似问题