Відповіді:
Це специфічне для 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, іноді ви хочете написати власні послідовності коду prolog / epilog, використовуючи вбудований код асемблера , щоб ви могли оголосити свою функцію голим атрибутом.
__declspec( naked ) int func( formal_parameters ) {}
Або
#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}
Зверніться до голих (C ++)
По суті, це те, як Microsoft представляє свої розширення C ++, щоб вони не суперечили майбутнім розширенням стандартного C ++. За допомогою __declspec ви можете віднести функцію або клас; точне значення змінюється залежно від природи __declspec. Наприклад, __declspec (голий) пригнічує генерацію prolog / epilog (для обробників переривань, вбудовуваного коду тощо), __declspec (потік) робить змінну нитку локальною тощо.
Повний список атрибутів __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)
перед кожною функцією у вашій бібліотеці