__declspec
Específicos de Microsoft
La sintaxis de atributo extendido para especificar información de clase de almacenamiento utiliza la palabra clave __declspec
, que especifica que una instancia de un tipo determinado se debe almacenar con un atributo de clase de almacenamiento específico de Microsoft que se muestra a continuación. Otros ejemplos de modificadores de clase de almacenamiento son las palabras clave static
y extern
. Sin embargo, estas palabras clave forman parte de la especificación ANSI de los lenguajes C y C++ y, como tales no se incluyen en la sintaxis de atributo extendido. La sintaxis de atributo extendido simplifica y normaliza las extensiones específicas de Microsoft a los lenguajes C y C++.
Grammar
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(
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-name | ,put=
put-func-name } )
restrict
safebuffers
selectany
spectre(nomitigation)
thread
uuid("
ComObjectGUID")
El espacio en blanco separa la secuencia de modificador de la declaración. En secciones posteriores aparecen ejemplos.
La gramática de atributos extendidos admite estos atributos de clase de almacenamiento específicos de 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
y thread
. También admite estos atributos de objetos COM: property
y uuid
.
Los atributos de clase de almacenamiento code_seg
, dllexport
dllimport
empty_bases
naked
noalias
nothrow
no_sanitize_address
property
restrict
selectany
thread
y uuid
son propiedades solo de la declaración del objeto o función a la que se aplican. El atributo thread
solo afecta a datos y objetos. Los atributos naked
y spectre
afectan solo a las funciones. Los atributos dllimport
y dllexport
afectan a funciones, datos y objetos. Los atributos property
, selectany
y uuid
afectan a objetos COM.
A efectos de compatibilidad con versiones anteriores, _declspec
es un sinónimo de __declspec
a menos que se especifique la opción del compilador /Za
(Deshabilitar extensiones de lenguaje).
Las palabras clave __declspec
deben colocarse al principio de una declaración simple. El compilador omite, sin advertencia, las __declspec
palabras clave colocadas después de * o y delante del identificador de variable en una declaración.
Un atributo __declspec
especificado al comienzo de una declaración de tipos definidos por el usuario se aplica a la variable de ese tipo. Por ejemplo:
__declspec(dllimport) class X {} varX;
En este caso, el atributo se aplica a varX
. Un atributo __declspec
situado después de la palabra clave class
o struct
se aplica al tipo definido por el usuario. Por ejemplo:
class __declspec(dllimport) X {};
En este caso, el atributo se aplica a X
.
La regla general para utilizar el atributo __declspec
para las declaraciones simples es la siguiente:
decl-specifier-seq
init-declarator-list
;
El objeto decl-specifier-seq
debe contener, entre otras cosas, un tipo base (por ejemplo, int
, float
, typedef
o un nombre de clase), una clase de almacenamiento (por ejemplo, static
, extern
) o la extensión __declspec
. init-declarator-list
debe contener, entre otras cosas, la parte de puntero de declaraciones. Por ejemplo:
__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
El código siguiente declara una variable local para el subproceso de entero y la inicializa con un valor:
// Example of the __declspec keyword
__declspec( thread ) int tls_i = 1;
FIN de Específicos de Microsoft
Consulte también
Palabras clave
Atributos extendidos de clase de almacenamiento de C
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de