Что такое __declspec и когда мне нужно его использовать?

Я видел экземпляры __declspec в коде, который я читаю. Что это? И когда мне нужно будет использовать эту конструкцию?

Ответ 1

Это специальное расширение Microsoft для языка С++, которое позволяет атрибутировать тип или функцию с информацией о классе хранения.

Документация

__ declspec (С++)

Ответ 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 и зависит от версии и платформы компилятора.