__declspec

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

Синтаксис расширенного атрибута для указания сведений о классе хранилища использует __declspec ключевое слово, который указывает, что экземпляр заданного типа должен храниться с помощью атрибута класса хранилища, указанного ниже. Примеры других модификаторов класса хранения включают ключевые слова 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(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-name,put= | put-func-name })
restrict
safebuffers
selectany
spectre(nomitigation)
thread
uuid("ComObjectGUID")

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

Расширенная грамматика атрибутов поддерживает следующие атрибуты класса хранилища майкрософт: align, allocatorallocateappdomaincode_segdeprecateddllexportdllimportempty_basesjitintrinsicnakednoaliasnoinlinenoreturnnothrownovtableno_sanitize_addressprocessrestrictsafebuffersselectanyspectrethread Он также поддерживает следующие атрибуты COM-объекта: property и uuid.

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

Для совместимости с предыдущими версиями является синонимом__declspec, _declspec если не указан параметр /Za компилятора (отключить расширения языка).

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

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

__declspec(dllimport) class X {} varX;

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

class __declspec(dllimport) X {};

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

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

decl-specifier-seq init-declarator-list ;

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

__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

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

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

Завершение блока, относящегося только к системам Майкрософт

См. также

Ключевые слова
Атрибуты расширенного класса хранилища C