Ответы:
Это специфическое расширение Microsoft для языка C ++, которое позволяет вам приписывать тип или функцию с информацией о классе хранения.
Документация
Каноническими примерами являются __declspec(dllimport)
и __declspec(dllexport)
, которые инструктируют компоновщик импортировать и экспортировать (соответственно) символ из или в DLL.
// header
__declspec(dllimport) void foo();
// code - this calls foo() somewhere in a DLL
foo();
( __declspec(..)
просто оборачиваем специфические вещи Microsoft - для достижения совместимости обычно оборачивают это макросами)
.lib
найденный символ с соответствующим экспортированным символом.
Другой пример, иллюстрирующий ключевое слово __declspec :
Когда вы пишете драйвер ядра Windows, иногда вы хотите написать свои собственные последовательности кода пролога / эпилога, используя встроенный код ассемблера , чтобы вы могли объявить свою функцию с атрибутом naked .
__declspec( naked ) int func( formal_parameters ) {}
Или
#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}
Пожалуйста, обратитесь к голым (C ++)
По сути, именно так Microsoft представляет свои расширения C ++, чтобы они не конфликтовали с будущими расширениями стандарта C ++. С __declspec вы можете приписать функцию или класс; точное значение зависит от характера __declspec. Например, __declspec (naked) подавляет генерацию пролога / эпилога (для обработчиков прерываний, встраиваемого кода и т. д.), __declspec (thread) делает переменную thread-local и т. д.
Полный список атрибутов __declspec доступен на MSDN и зависит от версии компилятора и платформы.
GCC 4.2
, что предложение альтернативы в дополнение к их , __attribute__ ((dllexport))
чтобы __declspec(dllexport)
, это справедливо для вызова __declspec
, Microsoft только расширение?
Я знаю, что прошло восемь лет, но я хотел поделиться этим фрагментом кода, найденным в 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
__declspec(dllexport)
перед каждой функцией в вашей библиотеке