_Declspec
Применение этого ключевого слова не ограничено визуальным программированием, однако также участвует в поддержке кода VCL.
Общее применение _declspec
Выражение вида _declspec (аргумент) является модификатором, который может применяться к функциям или переменным. Аргументы dllexport, dilimport и thread формируют модификаторы, соответствующие обычным export, _import и _thread. Разница между ними заключается в том, что обычные модификаторы должны всегда непосредственно предшествовать имени объявляемой переменной или функции, в то время как модификаторы _declspec можно помещать в любом месте объявления:
void _declspec(dllexport) f(void);// Верно.
_declspec(dllexport) void f(void);// Верно.
_export void f(void) // Ошибка: должно быть
// void export.
Другими аргументами _declspec общего применения являются:
- noreturn: Сообщает компилятору, что функция не возвращает управления вызывающей программе. Обычно, когда компилятор обнаруживает, что при некоторых условиях функция, объявленная с типом возвращаемого значения, ничего не возвращает, он выдает предупреждение. Однако если эта ситуация связана с вызовом другой функции, не возвращающей управления, то, объявив последнюю с модификатором _declspec (noreturn), можно подавить такое предупреждение. Вот пример:
_declspec(noreturn) void finish(){
...
throw "No return";
}
int RetInt(){
if(....)
return 1;
else
finish(); // Без noreturn генерировалось бы
// предупреждение.
__declspec(nothrow) void f();
void f() throw();
_declspec(property(get = get-функция,
put = put-функция)) объявление_ элемента;
Одна из спецификаций функций доступа может быть опущена. Компилятор транслирует обращения к “элементу данных” в вызовы функций доступа. Возможно также объявление “массива” с одним или несколькими “индексами”:
declspec(property(get=GetVal, put=PutVal)) int vArr[];
Число индексов в обращении к виртуальному массиву должно соответствовать числу параметров у функций доступа. (У простой виртуальной переменной get-функция не имеет ни одного, а put-функция имеет один параметр — присваиваемое значение.) Индексы не обязательно должны быть целыми, они могут быть, например, строками.
Однако инициализация глобальной переменной должна производиться только в одном месте. Если, например, глобальная переменная объявляется и инициализируется в заголовочном файле, подключаемом несколькими файлами проекта, при компоновке возникнет ошибка. Спецификация seiectany решает эту проблему:
_declspec(selectany) int gint = 10;
// Может появляться в
// нескольких файлах проекта.
selectany не может применяться к неинициализируемым переменным и переменным, недоступным за пределами текущего файла (т. е. глобальным статическим, например, глобальным константам C++ без спецификатора external).
_Declspec (uuid("GUID_COM-объекта") )
объявление/определение класса
Применение _declspec с VCL
Перечисленные ниже аргументы _declspec, служащие для поддержки VCL, редко применяются непосредственно. Они используются в макросах, определяемых файлом vcl\sysmac.h.