2014-10-20 14 views
13

Dlaczego standard powoduje tę różnicę?Czy istnieje różnica między kwalifikatorem _Atomic a specyfikatorem typu?

Wydaje się, że oba są identyczne, jak atomowy typ typu atomowego.

+0

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1485.pdf zawiera nieco więcej informacji na ten temat niż ostateczny standard C11. – nos

+0

możliwy duplikat http://stackoverflow.com/questions/10668941/c11-grammar-ambiguity-between-atomic-type-specifier-and-qualifier – CinCout

Odpowiedz

4

atomowe typu Specyfikatory: - :)

Syntax:  _Atomic (type-name); 

Można zadeklarować liczbę całkowitą atomową takiego:

 _Atomic(int) counter; 

_Atomic kluczowe może być stosowany w postaci _Atomic(T), gdzie T jest typ, jako specyfikator typu równoważny z _Atomic T. Tak więc _Atomic(T) x, y; deklaruje x i y z tego samego typu, nawet jeśli T jest typem wskaźnika. Pozwala to na trywialną zgodność z C++ 0x z definicją makr C++ tylko _Atomic(T) jako atomową.

Specyfikatorów typu atomowego nie należy używać, jeśli implementacja nie obsługuje typów atomowych. Nazwa typu w specyfikatorze typu atomowego nie powinna odnosić się do typu tablicy, typu funkcji, typu atomowego lub typu kwalifikowanego.

Właściwości związane z typami atomowymi mają znaczenie tylko dla wyrażeń o wartościach l.

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.

atomowe kwalifikacyjne typu: - :)

 _Atomic volatile int *p; 

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

innych typów niż typów wskaźnikowych, których odwołuje typ to typ obiektu nie będzie ograniczać kwalifikacjach. Typ zmodyfikowany przez kwalifikator _Atomic nie może być typem tablicy ani typem funkcji. Właściwości powiązane z typami kwalifikowanymi mają znaczenie tylko dla wyrażeń o wartościach l.

Jeśli ten sam kwalifikator pojawi się więcej niż jeden raz na tej samej liście kwalifikatorów, bezpośrednio lub za pomocą jednego lub więcej typów, zachowanie będzie takie samo, jak gdyby pojawiło się tylko raz. Jeśli inne kwalifikatory pojawiają się wraz z kwalifikatorem _Atomic na liście kwalifikatora specyfikatora, wynikowy typ jest tak typowym typem atomowym.

Słowo kluczowe _Atomic jest używane samodzielnie jako kwalifikator typu. Implementacja pozwala na złagodzenie wymogu posiadania tej samej reprezentacji i wyrównania odpowiedniego typu nieatomowego, o ile dokonywane są odpowiednie konwersje, w tym za pośrednictwem operatora przesyłania.

3

Tak. Jest różnica. Gdy stosuje się go jako typ specyfikatora następnie standardowy ograniczają go jako (6.7.2.4 s (3)):

Nazwa typu w atomowej specyfikatora typu nie odnosi się do typu tablicy, typu funkcji , typ atomowy lub kwalifikowany typ.

Przykładowo

typedef int arr[5]; 

arr może być nazwą typu, gdy jest używany jako _Atomic kwalifikacjach, ale nie mogą być wykorzystane jako nazwa typu, jeżeli jest stosowany jako _Atomic specyfikatora typu (np _Atomic (arr))

+3

6.7.3.3 ma ograniczenie także dla tablicy i typu funkcji dla kwalifikatora _Atomic. – nos

+1

@nos; Tak. Zostało to również wspomniane w 6.7.2.4. – haccks

Powiązane problemy