Warum macht der Standard diesen Unterschied?Gibt es einen Unterschied zwischen dem _Atomic-Typ-Qualifier und dem Type-Specifier?
Es scheint, als ob beide in der gleichen Weise einen atomaren Typ bezeichnen.
Warum macht der Standard diesen Unterschied?Gibt es einen Unterschied zwischen dem _Atomic-Typ-Qualifier und dem Type-Specifier?
Es scheint, als ob beide in der gleichen Weise einen atomaren Typ bezeichnen.
Atomic Typdeklarierer: - :)
Syntax: _Atomic (type-name);
Sie können eine atomare ganze Zahl wie folgt erklären:
_Atomic(int) counter;
Das _Atomic
Schlüsselwort kann in Form _Atomic(T)
verwendet werden, wobei T ein Typ als Typspezifizierer, äquivalent zu _Atomic
T. Daher deklariert _Atomic(T) x, y;
x und y mit demselben Typ, auch wenn T ein Zeigertyp ist. Dies ermöglicht triviale C++ 0x-Kompatibilität mit einer C++ nur _Atomic(T)
Makrodefinition als atomare.
Atomare Spezifizierer dürfen nicht verwendet werden, wenn die Implementierung keine atomaren Typen unterstützt. Der Typname in einem atomaren Typenspezifizierer darf sich nicht auf einen Array-Typ, einen Funktionstyp, einen atomaren Typ oder einen qualifizierten Typ beziehen.
Die Eigenschaften, die atomaren Typen zugeordnet sind, sind nur für Ausdrücke gültig, die lvalues sind.
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 Typ-Qualifikation: - :)
_Atomic volatile int *p;
It specifies that p has the type ‘‘pointer to volatile atomic int’’, a pointer to a volatile-qualified atomic type.
andere Typen als Zeigertypen, deren referenzierte Typ ist ein Objekttyp darf nicht beschränken qualifiziert. Der vom Qualifier _Atomic
geänderte Typ darf kein Array-Typ oder Funktionstyp sein. Die Eigenschaften, die qualifizierten Typen zugeordnet sind, sind nur für Ausdrücke gültig, die lvalues sind.
Wenn dasselbe Qualifikationsmerkmal mehr als einmal in der gleichen Spezifikations-Qualifikationsmerkmal-Liste erscheint, entweder direkt oder über einen oder mehrere Typdefs, verhält es sich so, als ob es nur einmal aufgetreten wäre. Wenn andere Qualifikationsmerkmale zusammen mit dem Qualifikationsmerkmal _Atomic
in einer Spezifizierer-Qualifikationsmerkmalliste angezeigt werden, ist der resultierende Typ der so qualifizierte atomare Typ.
Das Schlüsselwort _Atomic
wird allein als Typqualifizierer verwendet. Eine Implementierung kann das Erfordernis der gleichen Repräsentation und Ausrichtung des entsprechenden nicht-atomaren Typs lockern, solange entsprechende Konvertierungen vorgenommen werden, einschließlich über den Darstellungsoperator.
Ja. Da ist ein Unterschied. Wenn es als Typspezifizierer verwendet wird, dann Standard beschränken sie als (6.7.2.4 p (3)):
Der Typname in einem Atomtyp-Spezifizierer wird beziehen sich nicht auf ein Array-Typ, eine Funktionsart , ein atomarer Typ oder ein qualifizierter Typ.
Zum Beispiel
typedef int arr[5];
arr
können einen Typenname sein, wenn _Atomic
als Qualifier verwendet wird, kann aber nicht als Typnamen verwendet werden, wenn _Atomic
als Typangabe verwendet wird (wie _Atomic (arr)
)
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1485.pdf enthält ein wenig mehr Informationen als der endgültige C11-Standard. – nos
möglich duplicate von http://stackoverflow.com/questions/10668941/c11-grammar-ambiguity-between-atomic-type-specifier-and-qualifier – CinCout