_Atomic类型限定符和类型说明符之间有区别吗?

xde*_*000 15 c

为什么标准有所不同?

似乎两者都以同样的方式指定原子类型.

Anb*_*kar 7

原子类型说明符: - :)

Syntax:     _Atomic ( type-name );
Run Code Online (Sandbox Code Playgroud)

你可以像这样声明一个原子整数:

        _Atomic(int) counter;
Run Code Online (Sandbox Code Playgroud)

_Atomic关键字可以以的形式使用_Atomic(T),其中T是一个类型,类型说明符相当于一个_AtomicT.因此,_Atomic(T) x, y;声明x和y具有相同的类型,即使T是指针类型.这允许与仅C++ _Atomic(T)宏定义的原始C++ 0x兼容.

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

与原子类型关联的属性仅对作为左值的表达式有意义.

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;
Run Code Online (Sandbox Code Playgroud)

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

引用类型为对象类型的指针类型以外的类型不应受限制._Atomic限定符修改的类型不应是数组类型或函数类型.与限定类型关联的属性仅对作为左值的表达式有意义.

如果同一个限定符在同一个specifier-qualifier-list中出现多次,或者直接或通过一个或多个typedef,则行为与它只出现一次相同.如果其他限定符与_Atomicqualiner-qualifier-list中的限定符一起出现,则生成的类型是如此限定的原子类型.

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


hac*_*cks 5

是。它们是有区别的。当用作类型说明符时,标准将其限制为(6.7.2.4 p(3)):

原子类型说明符中的类型名称不得引用数组类型,函数类型,原子类型或限定类型

例如

typedef int arr[5];  
Run Code Online (Sandbox Code Playgroud)

arr_Atomic用作限定符时可以是类型名称,但在用作_Atomic类型说明符时不能用作类型名称(如_Atomic (arr)

  • 6.7.3.3 _Atomic限定符也对数组和函数类型有限制。 (3认同)