2014-10-20 8 views
13

Perché lo standard fa questa differenza?Esiste una differenza tra il qualificatore di tipo _Atomic e l'identificatore di tipo?

Sembra sia designato, allo stesso modo, un tipo atomico.

+0

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1485.pdf contiene un po 'più informazioni su questo rispetto allo standard C11 finale. – nos

+0

possibile duplicato di http://stackoverflow.com/questions/10668941/c11-grammar-ambiguity-between-atomic-type-specifier-and-qualifier – CinCout

risposta

4

prescrittori tipo atomico: - :)

Syntax:  _Atomic (type-name); 

è possibile dichiarare un intero atomica come questo:

 _Atomic(int) counter; 

Il _Atomic parola chiave può essere utilizzato in forma _Atomic(T), dove T è un tipo, come specificatore di tipo equivalente a _Atomic T. Pertanto, _Atomic(T) x, y; dichiara xey con lo stesso tipo, anche se T è un tipo di puntatore. Ciò consente una banale compatibilità C++ 0x con una definizione di macro solo C++ _Atomic(T) come atomica.

Gli identificatori di tipo atomico non devono essere utilizzati se l'implementazione non supporta i tipi atomici. Il nome del tipo in uno specificatore di tipo atomico non deve fare riferimento a un tipo di array, un tipo di funzione, un tipo atomico o un tipo qualificato.

Le proprietà associate ai tipi atomici sono significative solo per le espressioni che sono lvalue.

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 tipo qualificazioni: - :)

 _Atomic volatile int *p; 

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

Tipi diversi tipi di puntatore cui fa riferimento il tipo è un tipo di oggetto non sarà limitare qualificato. Il tipo modificato dal qualificatore _Atomic non deve essere un tipo di array o un tipo di funzione. Le proprietà associate ai tipi qualificati sono significative solo per le espressioni che sono lvalue.

Se lo stesso qualificatore appare più di una volta nella stessa lista di qualificatori di specificatori, direttamente o tramite uno o più typedef, il comportamento è lo stesso di se appare solo una volta. Se altri qualificatori vengono visualizzati insieme al qualificatore _Atomic in un elenco di specificatori di specificatori, il tipo risultante è il tipo atomico così qualificato.

La parola chiave _Atomic viene utilizzata, da sola, come un qualificatore di tipo. Un'implementazione è consentita per rilassare il requisito di avere la stessa rappresentazione e allineamento del corrispondente tipo non atomico, purché vengano eseguite le conversioni appropriate, anche tramite l'operatore del cast.

3

Sì. C'è una differenza. Quando viene utilizzato come indicatore di tipo normale quindi limitare come (6.7.2.4 p (3)):

Il nome tipo in un indicatore di tipo atomico non fa riferimento a un tipo matrice, un tipo di funzione , un tipo atomico o un tipo qualificato.

Ad esempio

typedef int arr[5]; 

arr può essere un nome di tipo quando _Atomic viene usato come qualificazione ma non può essere utilizzato come nome del tipo se _Atomic viene utilizzato come indicatore di tipo (come _Atomic (arr))

+3

6.7.3.3 ha limitazioni sull'array e sul tipo di funzione anche per il qualificatore _Atomic. – nos

+1

@nos; Sì. È menzionato anche in 6.7.2.4. – haccks

Problemi correlati