有一个相关的"什么"问题在这里:C11 grammar ambiguity between _Atomic type specifier and qualifier
我感兴趣的是为什么,因为C11的基本原理还没有发布,而且这似乎是不必要的复杂。
语法包括这两种语法(并解决了shift
(
而不是reduce
的歧义(如果后面跟着{{1},则可以预见到; {1}}或declarator
)),可从abstract-declarator
或declaration-specifiers
到达:
specifier-qualifier-list
这导致以下代码:
atomic-type-specifier: _Atomic ( type-name )
type-qualifier: _Atomic
思想:
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
不得修改数组或函数。除非在声明者周围使用多余的括号,这意味着它对_Atomic
有效(如果它对#define _Atomic(x) x _Atomic
个关键字合法,当然)。
当它作为#define
出现时,qualifier
与_Atomic
的语法部分相同,并且C程序员已经用于放置{ {1}}在正确的一面,因此不能使用"
答案 0 :(得分:4)
理由可在N1485中找到:
_Atomic
关键字也可以_Atomic(T)
的形式使用, 其中T
是一个类型,作为等同于_Atomic T
的类型说明符。 因此,_Atomic(T) x, y;
声明x
和y
具有相同的类型,甚至 如果T
是指针类型。这允许简单的C ++ 0x兼容性 仅使用C ++_Atomic(T)
宏定义为atomic<T>
。