__declspec

Specyficzne dla firmy Microsoft

Składnia atrybutu rozszerzonego do określania informacji o klasie magazynu używa __declspec słowa kluczowego, 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 magazynu obejmują słowa static kluczowe 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 standaryzuje rozszerzenia języków C i C++ specyficzne dla Microsoft.

Gramatyka

decl-specifier:
__declspec ( extended-decl-modifier-seq )

extended-decl-modifier-seq:
extended-decl-modifierZdecydować
extended-decl-modifier extended-decl-modifier-seq

extended-decl-modifier:
align(Numer)
allocate("segname")
allocator
appdomain
code_seg("segname")
deprecated
dllimport
dllexport
empty_bases
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")

Spacja oddziela sekwencje modyfikatora deklaracji. Przykłady są zamieszczone w kolejnych sekcjach.

Rozszerzona gramatyka atrybutów obsługuje te atrybuty klasy magazynu specyficzne dla firmy Microsoft: align, , dllexportrestrictappdomainallocatorallocatecode_segdeprecatednoinlinenoaliasnoreturnnakednothrowjitintrinsicnovtableno_sanitize_addressempty_basesdllimportsafebuffersselectanyprocessspectrei .thread Obsługuje również te atrybuty obiektów COM: property i uuid.

Atrybuty code_segklasy , , , noaliasdllimportnakednothrowno_sanitize_addressempty_basesdllexportrestrictselectanypropertythreadi uuid magazynu są właściwościami tylko deklaracji obiektu lub funkcji, do której są stosowane. Atrybut thread ma wpływ tylko na dane i obiekty. Atrybuty naked i spectre mają wpływ tylko na funkcje. Atrybuty dllimport i dllexport mają wpływ na funkcje, dane i obiekty. Atrybuty property, selectanyi uuid mają wpływ na obiekty COM.

Aby uzyskać zgodność z poprzednimi wersjami, jest synonimem, _declspec__declspec chyba że określono opcję /Za kompilatora (Wyłącz rozszerzenia języka).

Słowa __declspec kluczowe należy umieścić na początku prostej deklaracji. Kompilator ignoruje bez ostrzeżenia słowa __declspec kluczowe umieszczone po * lub i przed identyfikatorem zmiennej w deklaracji.

Atrybut __declspec określony na początku deklaracji typu zdefiniowanego 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 class kluczowym 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 ;

Element decl-specifier-seq powinien zawierać między innymi typ podstawowy (na przykład int, , float, typedeflub nazwę klasy), klasę magazynu (na przykład static, extern) lub __declspec rozszerzenie. Element 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łkowitoliczbową wątku lokalnego i inicjuje ją z wartością:

// Example of the __declspec keyword
__declspec( thread ) int tls_i = 1;

END Microsoft Specific

Zobacz też

Słowa kluczowe
Atrybuty rozszerzonej klasy magazynu języka C