2014-10-20 7 views
13

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.

+0

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

+0

möglich duplicate von http://stackoverflow.com/questions/10668941/c11-grammar-ambiguity-between-atomic-type-specifier-and-qualifier – CinCout

Antwort

4

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.

3

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))

+3

6.7.3.3 hat Einschränkung für Array und Funktionstyp auch für das _Atomic-Qualifikationsmerkmal. – nos

+1

@nos; Ja. Es ist auch in 6.7.2.4 erwähnt. – haccks

Verwandte Themen