Что на самом деле делает код "DECLDIR __declspec (dllexport)"? - PullRequest
6 голосов
/ 20 февраля 2010
#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)?

Ответы [ 2 ]

9 голосов
/ 20 февраля 2010

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

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

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

Один из способов думать об этом - __declspec(dllexport) помечает функцию как часть открытого интерфейса DLL.

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

1 голос
/ 20 февраля 2010

Определяет макропостоянную DECLDIR как __declspec(dllexport). dllexport для экспорта функций из DLL. Вот цитата из этой страницы :

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...