Udostępnij przez


__declspec

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

Zobacz też

słowa kluczowe
rozszerzone atrybuty klasy magazynu C