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.
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.
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.
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)
)
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
możliwy duplikat http://stackoverflow.com/questions/10668941/c11-grammar-ambiguity-between-atomic-type-specifier-and-qualifier – CinCout