Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
spécifique à Microsoft
La syntaxe d’attribut étendue permettant de spécifier des informations de classe de stockage utilise le mot clé __declspec
, qui spécifie qu’une instance d’un type donné doit être stockée avec un attribut de classe de stockage spécifique à Microsoft répertorié ci-dessous. Parmi d’autres modificateurs de classe de stockage, citons les mots clés static
et extern
. Toutefois, ces mots clés font partie de la spécification ANSI des langages C et C++, et, par conséquent, ne sont pas couverts par la syntaxe d’attribut étendue. La syntaxe d’attribut étendue simplifie et normalise les extensions spécifiques à Microsoft aux langages C et C++.
Grammaire
decl-specifier
:
__declspec (
extended-decl-modifier-seq
)
extended-decl-modifier-seq
:
extended-decl-modifier
opter
extended-decl-modifier
extended-decl-modifier-seq
extended-decl-modifier
:
align(
nombre)
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")
L’espace blanc sépare la séquence de modificateur de déclaration. Les exemples apparaissent dans les sections ultérieures.
La grammaire des attributs étendus prend en charge ces attributs de classe de stockage spécifiques à Microsoft : 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
, et thread
. Il prend également en charge ces attributs COM-object : property
et uuid
.
Les code_seg
, dllexport
, dllimport
, empty_bases
, naked
, noalias
, nothrow
, no_sanitize_address
, property
, restrict
, selectany
, thread
et uuid
attributs de classe de stockage ne sont des propriétés que de la déclaration de l’objet ou de la fonction à laquelle ils sont appliqués. L’attribut thread
affecte uniquement les données et les objets. Les attributs naked
et spectre
affectent uniquement les fonctions. Les attributs dllimport
et dllexport
affectent les fonctions, les données et les objets. Les attributs property
, selectany
et uuid
affectent les objets COM.
Pour la compatibilité avec les versions précédentes, _declspec
est un synonyme de __declspec
, sauf si l’option du compilateur /Za
(Désactiver les extensions de langage) est spécifiée.
Les mots clés __declspec
doivent être placés au début d’une déclaration simple. Le compilateur ignore, sans avertissement, les mots clés __declspec
placés après * ou & et devant l’identificateur de variable dans une déclaration.
Un attribut __declspec
spécifié au début d’une déclaration de type défini par l’utilisateur s’applique à la variable de ce type. Par exemple:
__declspec(dllimport) class X {} varX;
Dans ce cas, l’attribut s’applique à varX
. Un attribut __declspec
placé après le mot clé class
ou struct
s’applique au type défini par l’utilisateur. Par exemple:
class __declspec(dllimport) X {};
Dans ce cas, l’attribut s’applique à X
.
Les instructions générales relatives à l’utilisation de l’attribut __declspec
pour les déclarations simples sont les suivantes :
decl-specifier-seq
init-declarator-list
;
Le decl-specifier-seq
doit contenir, entre autres, un type de base (par exemple, int
, float
, un typedef
ou un nom de classe), une classe de stockage (par exemple, static
, extern
) ou l’extension __declspec
. Le init-declarator-list
doit contenir, entre autres, la partie pointeur des déclarations. Par exemple:
__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
Le code suivant déclare une variable locale de thread entier et l’initialise avec une valeur :
// Example of the __declspec keyword
__declspec( thread ) int tls_i = 1;
FIN de la section spécifique à Microsoft