C11 _Atomic说明符-vs-限定符语法不合理的原因?

o11*_*11c 4 c grammar atomic language-lawyer c11

这里有一个相关的“什么”问题:_Atomic类型说明符和限定符之间的C11语法歧义

我感兴趣的是为什么,因为C11的基本原理尚未发布,而且这似乎不必要地复杂。

语法包括这两种语法(并且解决了歧义,赞成shift使用(而不是reduce(如果后面跟有a declarator或,则将处于超前状态abstract-declarator)),可以从declaration-specifiers或到达specifier-qualifier-list:

atomic-type-specifier: _Atomic ( type-name )
type-qualifier: _Atomic
Run Code Online (Sandbox Code Playgroud)

这将导致以下代码:

int i1;
int (i2); // valid, same as i1 - usually seen in the context of pointer-to-function or pointer-to-array
int _Atomic a1;
int _Atomic (a2); // invalid
_Atomic (int) a3; // valid, same as a1
Run Code Online (Sandbox Code Playgroud)

想法:

  • _Atomic不得修改数组或函数。除非在声明符周围加上多余的括号,否则这将是有效的#define _Atomic(x) x _Atomic(如果对#define关键字当然是合法的)。

  • 当它发生的qualifier,_Atomic是一样的语法一部分const,和C程序员已经习惯于将const放在正确的一边,所以它不能成为“易用性”。

T.C*_*.C. 5

基本原理可在N1485中找到:

所述_Atomic关键字还也可以在形式使用_Atomic(T),其中,T是一种类型的,如类型说明符相当于一个_Atomic T。因此,即使是指针类型,也_Atomic(T) x, y;声明x和y具有相同的T类型。这允许使用仅C ++ _Atomic(T)宏定义作为C.0x兼容atomic<T>。