__declspec
Specifické pro Microsoft
Syntaxe rozšířeného atributu pro určení informací o třídě úložiště používá klíčové slovo __declspec, které určuje, že se instance daného typu uloží v rámci níže uvedeného atributu třídy úložiště specifické pro společnost Microsoft.Příklady dalších modifikátorů na úrovni úložiště zahrnují klíčová slova static a extern.Tato klíčová slova jsou však součástí specifikace ANSI jazyků C a C++ a jako taková nejsou zahrnuta v syntaxi doplňkového atributu.Syntaxe rozšířeného atributu zjednodušuje a standardizuje rozšíření specifické pro společnost Microsoft v rámci jazyků C a C++.
Gramatika
decl-specifier:
__declspec ( extended-decl-modifier-seq )extended-decl-modifier-seq:
extended-decl-modifieroptextended-decl-modifier extended-decl-modifier-seq
extended-decl-modifier:
align(#)allocate("segname")
appdomain
code_seg("segname")
deprecated
dllimport
dllexport
jitintrinsic
naked
noalias
noinline
noreturn
nothrow
novtable
process
property({get=get_func_name|,put=put_func_name})
restrict
safebuffers
selectany
thread
uuid("ComObjectGUID")
Mezera odděluje sekvenci modifikátoru deklarace.Příklady se zobrazí v pozdějších oddílech.
Rozšířená gramatika atributů podporuje tyto atributy třídy úložiště specifické pro společnost Microsoft: align, allocate, appdomain, code_seg, deprecated, dllexport, dllimport, jitintrinsic, naked, noalias, noinline, noreturn, nothrow, novtable, process, restrict, safebuffers, selectany a thread.Také podporuje tyto atributy objektu COM: property a uuid.
Atributy třídy úložiště code_seg, dllexport, dllimport, naked, noalias, nothrow, property, restrict, selectany, thread a uuid jsou vlastnosti pouze prohlášení objektu nebo funkce, u kterých jsou použity.Atribut thread má vliv pouze na data a objekty.Atribut naked ovlivňuje pouze funkce.Atributy dllimport a dllexport mají vliv na funkce, data a objekty.Objekty COM ovlivňují atributy property, selectany a uuid.
Klíčová slova __declspec je třeba umístit na začátek jednoduchého prohlášení.Kompilátor ignoruje bez varování všechna klíčová slova __declspec zadaná po * nebo & a před identifikátorem proměnné v prohlášení.
Atribut __declspec určený na začátku deklarace uživatelského typu platí pro proměnnou daného typu.Příklad:
__declspec(dllimport) class X {} varX;
V tomto případě platí atribut pro varX.Atribut __declspec umístěný za klíčovým slovem class nebo struct platí pro uživatelský typ.Příklad:
class __declspec(dllimport) X {};
V tomto případě platí atribut pro X.
Obecný návod pro použití atributu __declspec pro jednoduché deklarace je následující:
decl-specifier-seq declarator-list;
decl-specifier-seq by měl obsahovat mimo jiné i základní typ (napříkladint, float, typedef nebo název třídy), třída úložiště (např.static, extern), nebo výraz __declspec.init-declarator-list by měl obsahovat mimo jiné část deklarace s ukazatelem.Příklad:
__declspec(selectany) int * pi1 = 0; //OK, 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
Následující kód deklaruje místní proměnnou vlákna integer a inicializuje ji hodnotou:
// Example of the __declspec keyword
__declspec( thread ) int tls_i = 1;