2014-10-20 108 views
13

为什么这个标准会产生这种差异?_Atomic类型限定符和类型说明符有区别吗?

看起来好像两个同样的方式,一个原子类型

+0

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1485.pdf确实比最终的C11标准包含更多信息。 – nos 2014-10-22 12:48:27

+0

http://stackoverflow.com/questions/10668941/c11-grammar-ambiguity-between-atomic-type-specifier-and-qualifier – CinCout 2014-10-24 07:37:09

回答

4

原子类型说明符: - :)

Syntax:  _Atomic (type-name); 

可以声明这样的原子整数:

 _Atomic(int) counter; 

_Atomic关键字可以在形式_Atomic(T),其中T是被用来一个类型,作为类型说明符相当于_Atomic T.因此,_Atomic(T) x, y;声明x和y具有相同的类型,即使T是一个指针类型。这允许将C++ 0x与C++ _Atomic(T)宏定义的微小C++兼容性视为原子。

如果实现不支持原子类型,则不应使用原子类型说明符。 原子类型说明符中的类型名称不应引用数组类型,函数类型,原子类型或限定类型。

与原子类型相关的属性仅对左值表达式有意义。

If the _Atomic keyword is immediately followed by a left parenthesis, it is interpreted as a type specifier (with a type name), not as a type qualifier.

原子类型限定: - :)

 _Atomic volatile int *p; 
比指针类型,它们的引用类型是对象类型,不得限制资格的其他

It specifies that p has the type ‘‘pointer to volatile atomic int’’, a pointer to a volatile-qualified atomic type.

类型。 由_Atomic限定符修改的类型不应是数组类型或函数类型。 与限定类型关联的属性仅对左值表达式有意义。

如果相同限定符在同一个限定符列表中直接或通过一个或多个typedef出现多次,则行为与仅出现一次的行为相同。如果其他限定符与限定符 - 限定符列表中的_Atomic限定符一起出现,则生成的类型是合格的原子类型。

单独使用关键字_Atomic作为类型限定符。只要进行适当的转换,包括通过转换操作符,允许实现放宽具有相同的非原子类型的表示和对齐的要求。

3

是的。它们是有区别的。当它被用作类型说明符然后标准限制它作为(6.7.2.4 P(3)):

在原子类型说明符的类型名称应不是指数组类型,功能类型, 原子类型,或合格类型

例如

typedef int arr[5]; 

arr可当_Atomic用作限定符但如果_Atomic被用作类型说明符(如_Atomic (arr))不能被用作类型名称的类型名称

+3

6.7.3.3对_Atomic限定符也有数组和函数类型的限制。 – nos 2014-10-24 23:03:11

+1

@nos;是。它也在6.7.2.4中提到。 – haccks 2014-10-25 12:19:28