Compartir a través de


__declspec

Específico de Microsoft

La sintaxis de atributo extendida para especificar información de clase de almacenamiento usa la palabra clave __declspec, que especifica que una instancia de un tipo determinado se va a almacenar con un atributo de clase de almacenamiento específico de Microsoft que se muestra a continuación. Entre los ejemplos de otros modificadores de clase de almacenamiento se incluyen 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 tal, no están cubiertas por la sintaxis de atributo extendida. La sintaxis de atributo extendida simplifica y estandariza las extensiones específicas de Microsoft para los lenguajes C y C++.

Gramática

decl-specifier:
__declspec ( extended-decl-modifier-seq )

extended-decl-modifier-seq:
extended-decl-modifier optar por
extended-decl-modifier extended-decl-modifier-seq

extended-decl-modifier:
align( número)
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")

El espacio en blanco separa la secuencia de modificador de la declaración. Los ejemplos aparecen en secciones posteriores.

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 objeto COM: property y uuid.

Los code_seg, dllexport, dllimport, empty_bases, naked, noalias, nothrow, no_sanitize_address, property, restrict, selectany, thready uuid atributos de clase de almacenamiento son solo propiedades de la declaración del objeto o función a la que se aplican. El atributo thread solo afecta a los datos y objetos. Los atributos naked y spectre solo afectan a las funciones. Los atributos dllimport y dllexport afectan a funciones, datos y objetos. Los atributos property, selectanyy uuid afectan a los objetos COM.

Para la 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 palabras clave de __declspec colocadas después de * o & y delante del identificador de variable en una declaración.

Un atributo __declspec especificado al principio de una declaración de tipo definida 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 colocado 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 guía general para usar el atributo __declspec para declaraciones simples es la siguiente:

decl-specifier-seq init-declarator-list ;

El decl-specifier-seq debe contener, entre otras cosas, un tipo base (por ejemplo, int, float, un typedefo 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 Específico de Microsoft

Consulte también

Palabras clave
Atributos extendidos de clase de almacenamiento de C