Condividi tramite


__declspec

Sezione specifica Microsoft

La sintassi degli attributi estesa per specificare le informazioni relative alla classe di archiviazione utilizza la parola chiave __declspec, che specifica che un'istanza di un tipo specificato deve essere archiviata con un attributo della classe di archiviazione specifico di Microsoft elencato di seguito. Gli esempi degli altri modificatori della classe di archiviazione includono le parole chiave extern e static. Tuttavia, queste parole chiave fanno parte della specifica ANSI dei linguaggi C e C++ e, in quanto tali, non vengono analizzate dalla sintassi degli attributi estesa. La sintassi degli attributi estesa semplifica e standardizza le estensioni specifiche Microsoft in base ai linguaggi C e C++.

Grammatica

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

  • extended-decl-modifier-seq:
    extended-decl-modifieropt

    extended-decl-modifier extended-decl-modifier-seq

  • extended-decl-modifier:
    align(#)

    allocate("segname")

    appdomain

    code_seg("segname")

    deprecated

    dllimport

    dllexport

    jitintrinsic

    naked

    noalias

    noinline

    noreturn

    nothrow

    novtable

    process

    property({get=get_func_name|,put=put_func_name})

    restrict

    safebuffers

    selectany

    thread

    uuid("ComObjectGUID")

Uno spazio vuoto separa la sequenza dei modificatori di dichiarazione. Gli esempi vengono visualizzati nelle sezioni successive.

La grammatica dell'attributo estesa supporta i seguenti attributi della classe di archiviazione specifici di Microsoft: align, allocate, appdomain, code_seg, deprecated, dllexport, dllimport, jitintrinsic, naked, noalias, noinline, noreturn, nothrow, novtable, process, restrict, safebuffers, selectany e thread. Supporta inoltre gli attributi degli oggetti COM: property e uuid.

Gli attributi della classe di archiviazione code_seg, dllexport, dllimport, naked, noalias, nothrow, property, restrict, selectany, thread e uuid sono proprietà solo della dichiarazione dell'oggetto o della funzione a cui vengono applicati. L'attributo thread influisce solo sui dati e sugli oggetti. L'attributo naked influisce solo sulle funzioni. Gli attributi dllimport e dllexport influiscono sulle funzioni, sui dati e sugli oggetti. Gli attributi property, selectany e uuid influiscono sugli oggetti COM.

Le parole chiave __declspec devono essere inserite all'inizio di una dichiarazione semplice. Il compilatore ignora, senza avviso, qualsiasi parola chiave __declspec inserita dopo * o & e prima dell'identificatore della variabile in una dichiarazione.

Un attributo __declspec specificato all'inizio di una dichiarazione del tipo definito dall'utente si applica alla variabile di quel tipo. Ad esempio:

__declspec(dllimport) class X {} varX;

In questo caso, l'attributo si applica a varX. Un attributo __declspec inserito dopo la parola chiave struct o class si applica al tipo definito dall'utente. Ad esempio:

class __declspec(dllimport) X {};

In questo caso, l'attributo si applica a X.

Le linee guida per l'utilizzo dell'attributo __declspec per le dichiarazioni semplici sono le seguenti:

decl-specifier-seq declarator-list;

decl-specifier-seq deve contenere, tra l'altro, un tipo di base (ad esempio int, float, un typedef o nome di classe), una classe di archiviazione (ad esempio static, extern) o l'estensione __declspec. init-declarator-list deve contenere, tra l'altro, la parte di dichiarazioni del puntatore. Ad esempio:

__declspec(selectany) int * pi1 = 0;   //OK, 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

Nel codice seguente, ad esempio, viene dichiarata una variabile locale di thread di tipo Integer e quindi inizializzata con un valore:

// Example of the __declspec keyword
__declspec( thread ) int tls_i = 1;

Vedere anche

Riferimenti

Parole chiave C++

Attributi di classi di archiviazione estesi C