C11 _Atomic说明符 - vs-qualifier语法不规则的基本原理?

时间:2016-04-03 03:42:04

标签: c language-lawyer grammar atomic c11

有一个相关的"什么"问题在这里:C11 grammar ambiguity between _Atomic type specifier and qualifier

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

语法包括这两种语法(并解决了shift (而不是reduce的歧义(如果后面跟着{{1},则可以预见到; {1}}或declarator)),可从abstract-declaratordeclaration-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}}在正确的一面,因此不能使用"

1 个答案:

答案 0 :(得分:4)

理由可在N1485中找到:

  

_Atomic关键字也可以_Atomic(T)的形式使用,   其中T是一个类型,作为等同于_Atomic T的类型说明符。   因此,_Atomic(T) x, y;声明xy具有相同的类型,甚至   如果T是指针类型。这允许简单的C ++ 0x兼容性   仅使用C ++ _Atomic(T)宏定义为atomic<T>