Freigeben über


__declspec

Microsoft-spezifisch

Die erweiterte Attributsyntax zum Angeben von Speicherklasseninformationen verwendet das Schlüsselwort __declspec, das angibt, dass eine Instanz eines bestimmten Typs mit einem Microsoft-spezifischen Speicherklassen-Attribut gespeichert werden soll. Beispiele für andere Speicherklassenmodifizierer sind die static und extern Schlüsselwörter. Diese Schlüsselwörter sind jedoch Teil der ANSI-Spezifikation der C- und C++-Sprachen und werden daher nicht von der erweiterten Attributsyntax abgedeckt. Die erweiterte Attributsyntax vereinfacht und standardisiert microsoftspezifische Erweiterungen für die Sprachen C und C++.

Grammatik

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

extended-decl-modifier-seq:
extended-decl-modifier auswählen
extended-decl-modifier extended-decl-modifier-seq

extended-decl-modifier:
align( -Nummer)
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")

Die Deklarationsmodifizierersequenz ist durch Leerzeichen getrennt. Beispiele werden in späteren Abschnitten angezeigt.

Die erweiterte Attributgrammatik unterstützt die folgenden Microsoft-spezifischen Speicherklassenattribute: 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 und thread. Außerdem werden diese COM-Objektattribute unterstützt: property und uuid.

Die Attribute code_seg, dllexport, dllimport, empty_bases, naked, noalias, nothrow, no_sanitize_address, property, restrict, selectany, threadund uuid Speicherklassenattribute sind nur Eigenschaften der Deklaration des Objekts oder der Funktion, auf das sie angewendet werden. Das attribut thread wirkt sich nur auf Daten und Objekte aus. Die Attribute naked und spectre wirken sich nur auf Funktionen aus. Die attribute dllimport und dllexport wirken sich auf Funktionen, Daten und Objekte aus. Die Attribute property, selectanyund uuid wirken sich auf COM-Objekte aus.

Aus Gründen der Kompatibilität mit früheren Versionen ist _declspec ein Synonym für __declspec, es sei denn, die Compileroption /Za (Spracherweiterungen deaktivieren) angegeben ist.

Die __declspec Schlüsselwörter sollten am Anfang einer einfachen Deklaration platziert werden. Der Compiler ignoriert ohne Warnung alle __declspec Schlüsselwörter, die hinter * oder & und vor dem Variablenbezeichner in einer Deklaration platziert wurden.

Ein __declspec Attribut, das am Anfang einer benutzerdefinierten Typdeklaration angegeben ist, gilt für die Variable dieses Typs. Zum Beispiel:

__declspec(dllimport) class X {} varX;

In diesem Fall gilt das Attribut für varX. Ein Attribut __declspec, das nach dem Schlüsselwort class oder struct steht, wird auf den benutzerdefinierten Typ angewendet. Zum Beispiel:

class __declspec(dllimport) X {};

In diesem Fall gilt das Attribut für X.

Die allgemeine Richtlinie für die Verwendung des __declspec-Attributs für einfache Deklarationen lautet wie folgt:

decl-specifier-seq init-declarator-list ;

Die decl-specifier-seq sollte unter anderem einen Basistyp enthalten (z. B. int, float, ein typedefoder einen Klassennamen), eine Speicherklasse (z. B. static, extern) oder die __declspec Erweiterung. init-declarator-list sollte unter anderem den Zeigerteil von Deklarationen enthalten. Zum Beispiel:

__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

Der folgende Code deklariert eine lokale ganzzahlige Threadvariable und initialisiert sie mit einem Wert:

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

Ende Microsoft-spezifisch

Weitere Informationen

Schlüsselwörter
C-Speicherklassenattribute (erweitert)