__declspec
Microsoft-spezifisch
Die erweiterte Attributsyntax für die Angabe von Speicherklasseninformationen verwendet das __declspec-Schlüsselwort, das angibt, dass eine Instanz eines angegebenen Typs mit einem der unten aufgelisteten Microsoft-spezifischen Speicherklassenattribute gespeichert werden muss. Andere Speicherklassenmodifizierer sind beispielsweise die Schlüsselwörter static und extern. Allerdings sind diese Schlüsselwörter Teil der ANSI-Spezifikation der Programmiersprachen C- und C++ und werden als solche nicht von der erweiterten Attributsyntax abgedeckt. Die erweiterte Attributsyntax vereinfacht und standardisiert Microsoft-spezifische Erweiterungen der Programmiersprachen C und C++.
Grammatik
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")
Die Deklarationsmodifizierersequenz ist durch Leerzeichen getrennt. Beispiele finden Sie in späteren Abschnitten.
Die erweiterte Attributgrammatik unterstützt die folgenden Microsoft-spezifischen Speicherklassenattribute: align, allocate, appdomain, code_seg, deprecated, dllexport, dllimport, jitintrinsic, naked, noalias, noinline, noreturn, nothrow, novtable, process, restrict, safebuffers, selectany und thread. Sie unterstützt auch diese COM-Objektattribute: property und uuid.
Die Speicherklassenattribute code_seg, dllexport, dllimport, naked, noalias, nothrow, property, restrict, selectany, thread und uuid sind Eigenschaften nur der Deklaration des Objekts oder der Funktion, auf das bzw. die sie angewendet werden. Das thread-Attribut wirkt sich nur auf Daten und Objekte aus. Das naked-Attribut wirkt sich nur auf Funktionen aus. Die Attribute dllimport und dllexport haben Auswirkung auf Funktionen, Daten und Objekte. Die Attribute property, selectany und uuid beeinflussen COM-Objekte.
Die __declspec Schlüsselwörter sollten am Anfang einer einfachen Deklaration platziert werden. Der Compiler ignoriert ohne Warnung alle __declspec-Schlüsselwörter, die nach * oder & und vor dem Variablenbezeichner in einer Deklaration auftreten.
Ein __declspec-Attribut, das am Anfang einer benutzerdefinierten Typdeklaration angegeben wird, wird auf die Variable dieses Typs angewendet. Beispiel:
__declspec(dllimport) class X {} varX;
In diesem Fall wird das Attribut auf varX angewendet. Ein __declspec-Attribut, das nach dem class- oder struct-Schlüsselwort platziert wird, wird auf den benutzerdefinierten Typ angewendet. Beispiel:
class __declspec(dllimport) X {};
In diesem Fall wird das Attribut auf X angewendet.
Die allgemeine Richtlinie für die Verwendung des __declspec-Attributs für einfache Deklarationen lautet wie folgt:
decl-specifier-seq declarator-list;
decl-specifier-seq sollte unter anderem einen Basistyp enthalten (z. B. int, float, typedef oder einen Klassennamen), eine Speicherklasse (z. B. static, extern) oder die __declspec-Erweiterung. init-declarator-list sollte unter anderem den Zeigerteil von Deklarationen enthalten. Beispiel:
__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
Mit folgendem Code wird z. B. eine Ganzzahl-TLS-Variable deklariert und mit einem Wert initialisiert:
// Example of the __declspec keyword
__declspec( thread ) int tls_i = 1;