__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-modifier
Zdecydować
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
, , dllexport
restrict
appdomain
allocator
allocate
code_seg
deprecated
noinline
noalias
noreturn
naked
nothrow
jitintrinsic
novtable
no_sanitize_address
empty_bases
dllimport
safebuffers
selectany
process
spectre
i .thread
Obsługuje również te atrybuty obiektów COM: property
i uuid
.
Atrybuty code_seg
klasy , , , noalias
dllimport
naked
nothrow
no_sanitize_address
empty_bases
dllexport
restrict
selectany
property
thread
i 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
, selectany
i 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. 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. 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
, typedef
lub 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. 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