__declspec
Microsoft Specific
A sintaxe de atributo estendido para especificar informações de classe de armazenamento usa a __declspec
palavra-chave, que especifica que uma instância de um determinado tipo deve ser armazenada com um atributo de classe de armazenamento específico da Microsoft listado abaixo. Exemplos de outros modificadores de classe de armazenamento incluem as palavras-chave e extern
as static
palavras-chave. No entanto, essas palavras-chave fazem parte da especificação ANSI das linguagens C e C++ e, como tal, não são cobertas pela sintaxe de atributo estendido. A sintaxe de atributo estendido simplifica e padroniza extensões específicas da Microsoft para as linguagens C e C++.
Gramática
decl-specifier
:
__declspec (
extended-decl-modifier-seq
)
extended-decl-modifier-seq
:
extended-decl-modifier
Optar
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-nameput-func-name | ,put=
})
restrict
safebuffers
selectany
spectre(nomitigation)
thread
uuid("
ComObjectGUID")
O espaço em branco separa a sequência modificadora de declaração. Os exemplos aparecem nas seções posteriores.
A gramática de atributo estendido dá suporte a esses atributos de classe de armazenamento específicos da Microsoft: align
, , allocate
, allocator
, appdomain
, deprecated
dllexport
dllimport
code_seg
, empty_bases
, jitintrinsic
, naked
noalias
, noreturn
nothrow
noinline
, , novtable
, no_sanitize_address
,process
restrict
, selectany
safebuffers
e . spectre
thread
Ele também dá suporte a esses atributos com-objeto: property
e uuid
.
Os code_seg
atributos , dllexport
, dllimport
, empty_bases
, naked
, noalias
, nothrow
, no_sanitize_address
property
, restrict
, selectany
, thread
e uuid
da classe de armazenamento são propriedades apenas da declaração do objeto ou função à qual eles são aplicados. O thread
atributo afeta somente dados e objetos. Os naked
atributos e spectre
afetam apenas as funções. Os dllimport
atributos e dllexport
as funções afetam funções, dados e objetos. Os property
atributos e uuid
os selectany
atributos afetam objetos COM.
Para compatibilidade com versões anteriores, _declspec
é um sinônimo, a __declspec
menos que a opção /Za
do compilador (desabilitar extensões de idioma) seja especificada.
As __declspec
palavras-chave devem ser colocadas no início de uma declaração simples. O compilador ignora, sem aviso, quaisquer __declspec
palavras-chave colocadas após * ou & e na frente do identificador de variável em uma declaração.
Um __declspec
atributo especificado no início de uma declaração de tipo definida pelo usuário se aplica à variável desse tipo. Por exemplo:
__declspec(dllimport) class X {} varX;
Nesse caso, o atributo se aplica a varX
. Um __declspec
atributo colocado após a palavra-chave ou struct
se class
aplica ao tipo definido pelo usuário. Por exemplo:
class __declspec(dllimport) X {};
Nesse caso, o atributo se aplica a X
.
A diretriz geral para usar o __declspec
atributo para declarações simples é a seguinte:
decl-specifier-seq
init-declarator-list
;
O decl-specifier-seq
deve conter, entre outras coisas, um tipo base (por exemplo, int
, float
um typedef
ou um nome de classe), uma classe de armazenamento (por exemplo, static
, ) extern
ou a __declspec
extensão. O init-declarator-list
deve conter, entre outras coisas, a parte do ponteiro das declarações. Por exemplo:
__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
O código a seguir declara uma variável local de thread inteiro e a inicializa com um valor:
// Example of the __declspec keyword
__declspec( thread ) int tls_i = 1;
END Microsoft Specific
Confira também
Palavras-chave
Atributos de classe de armazenamento estendido C