Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
specyficzne dla firmy Microsoft
Rozszerzona składnia atrybutu do określania informacji o klasie magazynu używa słowa kluczowego __declspec, które określa, że wystąpienie danego typu ma być przechowywane z atrybutem klasy magazynu specyficznego dla firmy Microsoft wymienionym poniżej. Przykłady innych modyfikatorów klasy pamięci obejmują słowa kluczowe static i extern. Jednak te słowa kluczowe są częścią specyfikacji ANSI języków C i C++, a w związku z tym nie są objęte składnią atrybutów rozszerzonych. Składnia atrybutu rozszerzonego upraszcza i standandaryzuje rozszerzenia specyficzne dla firmy Microsoft dla języków C i C++.
Gramatyka
decl-specifier:
__declspec (
extended-decl-modifier-seq
)
extended-decl-modifier-seq:
extended-decl-modifier
wybierz
extended-decl-modifier
extended-decl-modifier-seq
extended-decl-modifier:
align(
numer)
allocate("
segname")
allocator
appdomain
code_seg("
segname")
deprecated
dllimport
dllexport
empty_bases
hybrid_patchable
jitintrinsic
naked
noalias
noinline
noreturn
nothrow
novtable
no_sanitize_address
process
property( { get=get-func-name | ,put=put-func-name } )
restrict
safebuffers
selectany
spectre(nomitigation)
thread
uuid("
ComObjectGUID")
Biała przestrzeń oddziela sekwencję modyfikatorów deklaracji. Przykłady są wyświetlane w kolejnych sekcjach.
Rozszerzona gramatyka atrybutów obsługuje te atrybuty klasy magazynu specyficzne dla firmy Microsoft: align, allocate, allocator, appdomain, code_seg, deprecated, dllexport, dllimport, empty_bases, jitintrinsic, naked, noalias, noinline, noreturn, nothrow, novtable, no_sanitize_address, process, restrict, safebuffers, selectany, spectre i thread. Obsługuje również te atrybuty obiektów COM: property i uuid.
Atrybuty code_seg, dllexport, dllimport, empty_bases, naked, noalias, nothrow, no_sanitize_address, property, restrict, selectany, threadi uuid atrybuty klasy magazynu są właściwościami tylko deklaracji obiektu lub funkcji, do której są stosowane. Atrybut thread wpływa tylko na dane i obiekty. Atrybuty naked i spectre mają wpływ tylko na funkcje. Atrybuty dllimport i dllexport wpływają na funkcje, dane i obiekty. Atrybuty property, selectanyi uuid wpływają na obiekty COM.
Aby uzyskać zgodność z poprzednimi wersjami, _declspec jest synonimem __declspec, chyba że określono opcję kompilatora /Za (Wyłącz rozszerzenia języka).
Słowa kluczowe __declspec należy umieścić na początku prostej deklaracji. Kompilator ignoruje bez ostrzeżenia słowa kluczowe __declspec umieszczone po * lub & i przed identyfikatorem zmiennej w deklaracji.
Atrybut __declspec określony na początku deklaracji typu zdefiniowanej przez użytkownika ma zastosowanie do zmiennej tego typu. Na przykład:
__declspec(dllimport) class X {} varX;
W tym przypadku atrybut ma zastosowanie do varX. Atrybut __declspec umieszczony po słowie kluczowym class lub struct ma zastosowanie do typu zdefiniowanego przez użytkownika. Na przykład:
class __declspec(dllimport) X {};
W tym przypadku atrybut ma zastosowanie do X.
Ogólne wytyczne dotyczące używania atrybutu __declspec dla prostych deklaracji są następujące:
decl-specifier-seq
init-declarator-list
;
decl-specifier-seq powinna zawierać między innymi typ podstawowy (na przykład int, float, typedeflub nazwę klasy), klasę magazynu (na przykład static, extern) lub rozszerzenie __declspec.
init-declarator-list powinien zawierać między innymi część wskaźnika deklaracji. Na przykład:
__declspec(selectany) int * pi1 = 0; //Recommended, selectany & int both part of decl-specifier
int __declspec(selectany) * pi2 = 0; //OK, selectany & int both part of decl-specifier
int * __declspec(selectany) pi3 = 0; //ERROR, selectany is not part of a declarator
Poniższy kod deklaruje zmienną całkowitą lokalną dla wątku i inicjuje ją przy użyciu wartości:
// Example of the __declspec keyword
__declspec( thread ) int tls_i = 1;
END specyficzne dla firmy Microsoft