__declspec

Блок, относящийся только к системам Майкрософт

Расширенный синтаксис атрибутов для указания данных класса памяти использует ключевое слово __declspec, которое указывает, что экземпляр заданного типа должен хранится с перечисленным ниже атрибутом класса хранения для систем Microsoft. Примеры других модификаторов класса хранения включают ключевые слова static и extern. Однако эти ключевые слова — часть спецификации ANSI языков C и C++, и как таковые они не описаны расширенным синтаксисом атрибутов. Расширенный синтаксис атрибутов упрощает и стандартизирует расширения для систем Microsoft в соответствии с правилами языков C и С++.

Грамматика

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

  • extended-decl-modifier-seq:
    extended-decl-modifierнеоб

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

Пробел отделяет последовательность модификаторов объявления. Примеры приведены в дальнейших разделах.

Расширенная форма атрибутов поддерживает следующие атрибуты классов памяти для систем Microsoft: align, allocate, appdomain, code_seg, deprecated, dllexport, dllimport, jitintrinsic, naked, noalias, noinline, noreturn, nothrow, novtable, process, restrict, safebuffers, selectany и thread. Она также поддерживает следующие атрибуты COM-объекта: property и uuid.

Атрибуты класса хранения code_seg, dllexport, dllimport, naked, noalias, nothrow, property, restrict, selectany, thread и uuid — это свойства исключительно объявления объекта или функции, к которым они применяются. Атрибут thread влияет только на данные и объекты. Атрибут naked влияет только на функции. Атрибуты dllimport и dllexport влияют на функции, данные и объекты. Атрибуты property, selectany и uuid влияют на COM-объекты.

Ключевые слова __declspec необходимо поместить в начале простого объявления. Компилятор игнорирует без предупреждения все ключевые слова __declspec, находящиеся после * или &, а также перед идентификатором переменной в объявлении.

Атрибут __declspec, указанный в начале объявления пользовательского типа, относится к переменной этого типа. Например:

__declspec(dllimport) class X {} varX;

В этом случае атрибут применяется к varX. Атрибут __declspec, помещенный после ключевого слова class или struct, применяется к пользовательскому типу. Например:

class __declspec(dllimport) X {};

В этом случае атрибут применяется к X.

Ниже приводятся общие рекомендации для использования атрибута __declspec для простых объявлений.

decl-specifier-seq declarator-list;

decl-specifier-seq должно содержать, помимо прочего, базовый тип (например, int, float, typedef или имя класса), класс хранения (например static, extern) или расширение __declspec. init-declarator-list должно содержать, помимо прочего, часть указателя объявлений. Например:

__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

В следующем примере кода объявлена целочисленная локальная переменная потока и инициализирована с использованием следующего значения:

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

См. также

Ссылки

Ключевые слова в C++

Расширенные атрибуты классов хранения в C