2014-10-20 120 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