что на самом деле означает __declspec (dllimport)? - PullRequest
76 голосов
/ 14 января 2012

Я видел исходный код Qt примерно так:

class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};

Какой макрос Q_CORE_EXPORT определяет, как показано ниже:

define Q_DECL_IMPORT __declspec(dllimport)

Так что же на самом деле означает __declspec(dllimport)

Ответы [ 3 ]

99 голосов
/ 14 января 2012

__declspec - это атрибут, специфичный для Microsoft, который позволяет указывать информацию о классе хранения.
(Уголок Нитпикера: однако, ряд других поставщиков компиляторов, например, 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.

20 голосов
/ 14 января 2012

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

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

1 голос
/ 14 января 2012

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

...