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



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

1291   6  
c++

6 ответов:

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

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

_ _ declspec (C++)

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

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


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

(__declspec(..) просто обертывает конкретные вещи Microsoft - для достижения совместимости, как правило, обернуть его с макросами)

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

еще один пример для иллюстрации _ _ declspec ключевые слова:

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

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

Я знаю, что прошло восемь лет, но я хотел поделиться этим фрагментом кода, найденным в MRuby, который показывает, как __declspec() может ли bee использоваться на том же уровне, что и 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

Comments

    Ничего не найдено.