__declspec
Microsoft-spezifisch
Die erweiterte Attributsyntax zum Angeben von Speicherklasseninformationen verwendet die __declspec
Schlüsselwort (keyword), die 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üsselwort (keyword) sind jedoch Teil der ANSI-Spezifikation der C- und C++-Sprachen und werden 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-modifier
opt
extended-decl-modifier
extended-decl-modifier-seq
extended-decl-modifier
:
align(
Zahl)
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-name,put=
| put-func-name })
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
, , appdomain
allocator
, code_seg
, , dllimport
restrict
jitintrinsic
empty_bases
naked
dllexport
noalias
deprecated
noinline
noreturn
safebuffers
process
selectany
novtable
no_sanitize_address
nothrow
und . spectre
thread
Außerdem werden diese COM-Objektattribute unterstützt: property
und uuid
.
Die code_seg
Attribute , dllexport
, empty_bases
naked
nothrow
no_sanitize_address
noalias
dllimport
restrict
selectany
property
thread
und 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. Die property
, selectany
und uuid
Attribute wirken sich auf COM-Objekte aus.
Aus Gründen der Kompatibilität mit früheren Versionen _declspec
ist ein Synonym für __declspec
die Angabe der Compileroption /Za
(Sprachenerweiterungen deaktivieren).
Die __declspec
Schlüsselwort (keyword) sollten am Anfang einer einfachen Deklaration platziert werden. Der Compiler ignoriert ohne Warnung alle __declspec
Schlüsselwort (keyword), 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. Beispiel:
__declspec(dllimport) class X {} varX;
In diesem Fall wird das Attribut auf varX
angewendet. Ein __declspec
Attribut, das nach dem oder struct
dem class
Schlüsselwort (keyword) auf den benutzerdefinierten Typ angewendet wird. 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 int
. B. , float
ein , ein typedef
Oder ein Klassenname), eine Speicherklasse (z static
. B. , , extern
) oder 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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für