Compartilhar via


__declspec

Específico da Microsoft

A sintaxe de atributo estendido para especificar informações de classe de armazenamento usa a palavra-chave __declspec, 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 static e extern. 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-modifieropte por
extended-decl-modifierextended-decl-modifier-seq

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

O espaço em branco separa a sequência do modificador de declaração. Exemplos aparecem em 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, code_seg, deprecated, dllexport, dllimport, empty_bases, jitintrinsic, naked, noalias, noinline, noreturn, nothrow, novtable, no_sanitize_address,process, restrict, safebuffers, selectany, spectree thread. Ele também dá suporte a esses atributos de objeto COM: property e uuid.

Os atributos code_seg, dllexport, dllimport, empty_bases, naked, noalias, nothrow, no_sanitize_address, property, restrict, selectany, threade uuid de classe de armazenamento são propriedades apenas da declaração do objeto ou função à qual são aplicados. O atributo thread afeta apenas dados e objetos. Os atributos naked e spectre afetam apenas as funções. Os atributos dllimport e dllexport afetam funções, dados e objetos. Os atributos property, selectanye uuid afetam objetos COM.

Para compatibilidade com versões anteriores, _declspec é um sinônimo para __declspec, a menos que a opção do compilador /Za (Desabilitar extensões de linguagem) seja especificada.

As palavras-chave __declspec devem ser colocadas no início de uma declaração simples. O compilador ignora, sem aviso, quaisquer palavras-chave __declspec colocadas após * ou & e na frente do identificador de variável em uma declaração.

Um atributo __declspec 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 atributo __declspec colocado após a palavra-chave class ou struct se 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 atributo __declspec para declarações simples é a seguinte:

decl-specifier-seqinit-declarator-list;

O decl-specifier-seq deve conter, entre outras coisas, um tipo base (por exemplo, int, float, um typedefou um nome de classe), uma classe de armazenamento (por exemplo, static, extern) ou a extensão __declspec. A init-declarator-list deve conter, entre outras coisas, a parte do ponteiro de 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;

Fim da seção específica da Microsoft

Consulte também

palavras-chave
atributos da classe de armazenamento estendida C