Udostępnij za pośrednictwem


__declspec

Specyficzne dla firmy Microsoft

Składnia atrybutów rozszerzonych służących do określania informacji klasy magazynowania wykorzystuje słowo kluczowe __declspec, które określa, że wystąpienie danego typu ma być przechowywane z atrybutem klasy magazynowania specyficznym dla firmy Microsoft wymienionym poniżej.Przykłady innych modyfikatorów klasy magazynowania, w tym słowa kluczowe static i extern.Jednak te słowa kluczowe są częścią specyfikacji ANSI w językach C i C++ i jako takie nie są objęte składnią atrybutów rozszerzonych.Składnia atrybutu rozszerzonego upraszcza i standaryzuje rozszerzenia języków C i C++ specyficzne dla Microsoft.

Gramatyka

  • 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")

Spacja oddziela sekwencje modyfikatora deklaracji.Przykłady są zamieszczone w kolejnych sekcjach.

Gramatyka rozszerzonych atrybutów obsługuje te atrybuty specyficzne dla klas magazynowania Microsoft: align, allocate, appdomain, code_seg, deprecated, dllexport, dllimport, jitintrinsic, naked, noalias, noinline, noreturn, nothrow, novtable, process, restrict, safebuffers, selectany i thread.Obsługuje również te atrybuty obiektu COM: property i uuid.

Atrybuty klasy magazynowania code_seg, dllexport, dllimport, naked, noalias, nothrow, property, restrict, selectany, thread i uuid są właściwości tylko dla deklaracji obiektu lub funkcji, do których są stosowane.Atrybut thread ma wpływ jedynie na dane i obiekty.Atrybut naked dotyczy tylko funkcji.Atrybuty dllimport i dllexport wpływają na funkcje, dane i obiekty.Atrybuty property, selectany i uuid mają wpływ na obiekty COM.

Słowa kluczowe __declspec powinny być umieszczone na początku zwykłej deklaracji.Kompilator ignoruje, bez ostrzeżenia, wszelkie słowa kluczowe __declspec umieszczone po * lub & i przed identyfikatorem zmiennej w deklaracji.

Atrybut __declspec określony na początku deklaracji typu zdefiniowanego przez użytkownika stosuje się do zmiennej tego typu.Na przykład:

__declspec(dllimport) class X {} varX;

W tym przypadku atrybut dotyczy varX.Atrybut __declspec umieszczony po słowie kluczowym class lub struct ma zastosowanie do typu zdefiniowanego przez użytkownika.Na przykład:

class __declspec(dllimport) X {};

W tym przypadku atrybut dotyczy X.

Ogólne wytyczne dotyczące korzystania z atrybutu __declspec dla prostych deklaracji są następujące:

decl-specifier-seq declarator-list;

decl-specifier-seq powinien zawierać, między innymi, typ podstawowy (np.int, float, typedef lub nazwę klasy), klasę magazynu (np.static, extern) lub rozszerzenie __declspec.init-declarator-list powinien zawierać, między innymi, część wskaźnika deklaracji.Na przykład:

__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

Poniższy kod deklaruje zmienną całkowitoliczbową wątku lokalnego i inicjuje ją z wartością:

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

Zobacz też

Informacje

Słowa kluczowe języka C++

Rozszerzone atrybuty klasy magazynu języka C