Что такое __declspec и когда мне нужно его использовать? - PullRequest
133 голосов
/ 18 февраля 2010

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

Ответы [ 6 ]

68 голосов
/ 18 февраля 2010

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

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

__ declspec (C ++)

46 голосов
/ 18 февраля 2010

Каноническими примерами являются __declspec(dllimport) и __declspec(dllexport), которые инструктируют компоновщику импортировать и экспортировать (соответственно) символ из или в DLL.

// header
__declspec(dllimport) void foo();


// code - this calls foo() somewhere in a DLL
foo();

(__declspec(..) просто завершает работуСпецифика Microsoft - для достижения совместимости обычно нужно обернуть это макросами)

18 голосов
/ 18 февраля 2010

В основном используется для импорта символов из / экспорта символов в общую библиотеку (DLL). Компиляторы Visual C ++ и GCC поддерживают __declspec(dllimport) и __declspec(dllexport). Другие применения (некоторые только для Microsoft) документированы в MSDN .

12 голосов
/ 20 мая 2011

Другой пример, иллюстрирующий ключевое слово __ declspec :

Когда вы пишете драйвер ядра Windows, иногда вы хотите написать собственные последовательности кодов пролога / эпилога с использованием встроенного ассемблеракод , чтобы вы могли объявить свою функцию с атрибутом naked .

__declspec( naked ) int func( formal_parameters ) {}

или

#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}

Пожалуйста, обратитесь к naked (C ++))

6 голосов
/ 18 февраля 2010

По сути, именно так Microsoft представляет свои расширения C ++, чтобы они не вступали в конфликт с будущими расширениями стандарта C ++. С __declspec вы можете приписать функцию или класс; точное значение варьируется в зависимости от природы __declspec. Например, __declspec (naked) подавляет генерацию пролога / эпилога (для обработчиков прерываний, встраиваемого кода и т. д.), __declspec (thread) создает переменную thread-local и т. д.

Полный список атрибутов __declspec доступен на MSDN и зависит от версии компилятора и платформы.

0 голосов
/ 14 июня 2018

Я знаю, что прошло восемь лет, но я хотел поделиться этим фрагментом кода, найденным в MRuby, который показывает, как __declspec() можно использовать на том же уровне, что и export keyword.

/** Declare a public MRuby API function. */
#if defined(MRB_BUILD_AS_DLL)
#if defined(MRB_CORE) || defined(MRB_LIB)
# define MRB_API __declspec(dllexport)
#else
# define MRB_API __declspec(dllimport)
#endif
#else
# define MRB_API extern
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...