__declspec

Microsoft-spezifisch

Die erweiterte Attributsyntax zum Angeben von Speicherklasseninformationen verwendet das __declspec Schlüsselwort, das angibt, dass eine Instanz eines bestimmten Typs mit einem microsoft-spezifischen Speicherklassen-Attribut gespeichert werden soll. Andere Speicherklassenmodifizierer sind beispielsweise die Schlüsselwörter static und extern . Diese Schlüsselwörter sind jedoch Teil der ANSI-Spezifikation der C- und C++-Sprachen und sind daher nicht durch erweiterte 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-modifieropt
extended-decl-modifier extended-decl-modifier-seq

extended-decl-modifier:
align(number)
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-nameput-func-name | ,put=})
restrict
safebuffers
selectany
spectre(nomitigation)
thread
uuid("ComObjectGUID")

Die Deklarationsmodifizierersequenz ist durch Leerzeichen getrennt. Beispiele finden Sie in späteren Abschnitten.

Erweiterte Attributgrammatik unterstützt diese microsoftspezifischen Speicherklassenattribute: align, allocate, allocatorrestrictcode_segappdomaindeprecateddllexportnoinlinenoaliasnoreturnnakednothrowjitintrinsicnovtableno_sanitize_addressempty_basesdllimportsafebuffersselectanyprocessspectreund .thread Außerdem werden diese COM-Objektattribute unterstützt: property und uuid.

Die code_segAttribute , dllexport, empty_basesnakednothrowno_sanitize_addressnoaliasdllimportrestrictselectanypropertythreadund uuid Speicherklassen sind nur Eigenschaften der Deklaration des Objekts oder der Funktion, auf die sie angewendet werden. Das thread Attribut wirkt sich nur auf Daten und Objekte aus. Die naked Attribute spectre wirken sich nur auf Funktionen aus. Die dllimport Attribute dllexport wirken sich auf Funktionen, Daten und Objekte aus. selectanyDie property, und uuid Attribute wirken sich auf COM-Objekte aus.

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

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 & 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. Beispiel:

__declspec(dllimport) class X {} varX;

In diesem Fall wird das Attribut auf varX angewendet. Ein __declspec Attribut, das nach dem oder dem classstruct Schlüsselwort auf den benutzerdefinierten Typ angewendet wurde. 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 init-declarator-list ;

Dies decl-specifier-seq sollte unter anderem einen Basistyp (z. B. , floatintein , ein typedefoder einen Klassennamen), eine Speicherklasse (zstatic. B. , ), externoder die __declspec Erweiterung enthalten. Der init-declarator-list Zeigerteil der Deklarationen sollte unter anderem enthalten. 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

Mit folgendem Code wird z. B. eine ganzzahlige threadlokale Variable deklariert und mit einem Wert initialisiert:

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

Ende Microsoft-spezifisch

Siehe auch

Schlüsselwörter
C erweiterte Speicherklassenattribute