Подтвердить что ты не робот

Что означает __declspec (dllimport)?

Я видел исходный код Qt следующим образом:

class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};

Какой макрос Q_CORE_EXPORT определяется следующим образом:

define Q_DECL_IMPORT __declspec(dllimport)

Итак, что означает __declspec(dllimport)?

4b9b3361

Ответ 1

__declspec - это атрибут, специфичный для Microsoft, который позволяет указать информацию о классе хранения.
(Nitpicker Corner: Однако ряд других поставщиков компиляторов, например GCC, теперь поддерживают это языковое расширение для совместимости с установленной базой кода, написанной с таргетингом на компиляторы Microsoft. Некоторые даже предоставляют дополнительные атрибуты класса хранения.)суб >

Два из этих атрибутов класса хранения, которые могут быть указаны, - dllimport и dllexport. Они указывают компилятору, что функция или объект импортируются или экспортируются (соответственно) из DLL.

В частности, они определяют интерфейс DLL для клиента, не требуя файла определения модуля (.DEF). Большинство людей находят гораздо проще использовать эти языковые расширения, чем создавать файлы DEF.

По понятным причинам, __declspec(dllimport) и __declspec(dllexport), как правило, спарены друг с другом. Вы используете dllexport для обозначения символа, экспортированного из DLL, и используете dllimport для импорта экспортированного символа в другой файл.

Из-за этого и из-за того, что один и тот же заголовочный файл обычно используется как при компиляции DLL, так и в клиентском коде, который потребляет интерфейс DLL, это общий шаблон для определения макроса, который автоматически переходит к соответствующему спецификатору атрибута при компиляции -время. Например:

#if COMPILING_DLL
    #define DLLEXPORT __declspec(dllexport)
#else
    #define DLLEXPORT __declspec(dllimport)
#endif

Затем отметьте все символы, которые должны быть экспортированы с помощью dllexport.

Предположительно, это то, что делает макрос Q_CORE_EXPORT, разрешая либо Q_DECL_IMPORT, либо Q_DECL_EXPORT.

Ответ 2

__declspec(dllimport) - спецификатор класса хранения, который сообщает компилятору, что функция или объект или тип данных определены во внешней DLL.

Функция или объект или тип данных экспортируются из DLL с соответствующим __declspec(dllexport).

Ответ 3

Это означает, что определение функции находится в динамической библиотеке. Более подробную информацию и примеры см. В документации.