Я видел экземпляры __declspec в коде, который я читаю. Что это? И когда мне нужно будет использовать эту конструкцию?
Что такое __declspec и когда мне нужно его использовать?
Ответ 1
Это специальное расширение Microsoft для языка С++, которое позволяет атрибутировать тип или функцию с информацией о классе хранения.
Документация
Ответ 2
К каноническим примерам относятся __declspec(dllimport)
и __declspec(dllexport)
, которые инструктируют компоновщик импортировать и экспортировать (соответственно) символ из или в DLL.
// header
__declspec(dllimport) void foo();
// code - this calls foo() somewhere in a DLL
foo();
(__declspec(..)
просто завершает Microsoft специфические вещи - для достижения совместимости, обычно можно было бы обернуть его макросами)
Ответ 3
В основном используется для импорта символов из/экспорта символов в общую библиотеку (DLL). Оба компилятора Visual С++ и GCC поддерживают __declspec(dllimport)
и __declspec(dllexport)
. Другие использования (некоторые только для Microsoft) документируются в MSDN.
Ответ 4
Еще один пример, иллюстрирующий ключевое слово __ declspec:
Когда вы пишете драйвер ядра Windows, иногда вы хотите написать свои собственные последовательности кода пролога/эпилога с помощью встроенного кода ассемблера, чтобы вы могли объявить свою функцию с помощью голого.
__declspec( naked ) int func( formal_parameters ) {}
или
#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}
Обратитесь к голый (С++)
Ответ 5
По сути, это то, как Microsoft вводит свои расширения на С++, чтобы они не конфликтуют с будущими расширениями стандартного С++. С помощью __declspec вы можете присвоить функцию или класс; точный смысл варьируется в зависимости от характера __declspec. __declspec (голый), например, подавляет генерацию пролога/эпилога (для обработчиков прерываний, встраиваемый код и т.д.), __declspec (thread) создает переменную thread-local и т.д.
Полный список атрибутов __declspec доступен в MSDN и зависит от версии и платформы компилятора.