Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
, thread
und 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
, selectany
und 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 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. 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