Что делает код “DECLDIR __ declspec (dllexport)”, действительно делают?

#ifndef _DLL_TUTORIAL_H_
#define _DLL_TUTORIAL_H_
#include <iostream>

#if defined DLL_EXPORT
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif

extern "C"
{
   DECLDIR int Add( int a, int b );
   DECLDIR void Function( void );
}

#endif

Что делает код DECLDIR __declspec(dllexport) действительно?

6
задан Peter Lang 20 February 2010 в 07:47
поделиться

2 ответа

В мире Microsoft __ declspec (dllexport) делает функцию или класс доступными для вызова извне DLL.

Когда вы создаете DLL, по умолчанию любые функции, определенные в этой DLL, могут быть вызваны только из той же самой DLL. Вы не можете вызвать эту функцию из исполняемого файла или другой DLL.

Если вы хотите, чтобы ваша функция вызывалась извне DLL, вам нужно экспортировать ее, добавив __ declspec (dllexport) .

Можно думать об этом так: __ declspec (dllexport) отмечает функцию как часть открытого интерфейса DLL.

Хотя вы не спрашивали о __ declspec (dllimport) , это как бы противоположное. При вызове функции в другой DLL ваша DLL должна знать, что она является частью публичного интерфейса другой DLL, чтобы она могла правильно обрабатывать вызов (для вызова функции в другой DLL требуется более сложный код, который вызывает функцию в себе).

9
ответ дан 10 December 2019 в 00:37
поделиться

Макроконстанта DECLDIR определяется как __ declspec (dllexport) . dllexport предназначен для экспорта функций из библиотек DLL. Вот цитата из этой страницы :

Эти атрибуты явно определяют интерфейс DLL для ее клиента, который может быть исполняемым файлом или другим DLL. Объявление функций как dllexport устраняет необходимость в файле определения модуля (.DEF), по крайней мере, в отношении спецификации экспортируемых функций. { {1}} Обратите внимание, что dllexport заменяет ключевое слово __export.

Если класс отмечен как declspec (dllexport), любые специализации шаблонов классов в иерархии классов неявно помечаются как declspec (dllexport) . Это означает, что шаблоны явно создаются, и его члены должны быть определены .

__ declspec , кстати, объясняется здесь .

1
ответ дан 10 December 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: