代码“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)究竟做了什么?代码“DECLDIR __declspec(dllexport)”究竟做了什么?

+1

@deepak:欢迎来到'*'!我格式化了您的代码(选择它并按下Ctrl + K)。 – 2010-02-20 07:48:47

它将DECLDIR宏定义定义为__declspec(dllexport)dllexport用于从DLL导出函数。下面是从this page报价:

这些属性明确定义 DLL的接口,它的客户端,这 可以是可执行文件或其他 DLL。将函数声明为dllexport 不需要 模块定义(.DEF)文件,至少在 规范的导出函数中。 请注意,dllexport取代了 __export关键字。

如果一个类被标记 declspec(DLLEXPORT),类模板在 的类层次结构的任何 特隐含 标记为declspec(DLLEXPORT)。此 表示模板明确地 实例化,其成员必须是 定义。

__declspec,顺便说一句,是explained here

在微软的世界里,__declspec(dllexport)使一个函数或类可以从DLL外部调用。

当您创建DLL时,默认情况下,DLL中定义的任何函数只能从同一个DLL中调用。您不能从可执行文件或其他DLL调用该函数。

如果您希望从DLL外部调用函数,则需要通过添加__declspec(dllexport)将其导出。

想一想的一种方法是__declspec(dllexport)将函数标记为DLL公共接口的一部分。

虽然你没有问关于__declspec(dllimport)是相反的。当在一个不同的DLL中调用一个函数时,你的DLL需要知道它是不同DLL的公共接口的一部分,所以它可以正确处理这个调用(调用另一个DLL中的函数需要更复杂的代码来调用你自己的函数)。

+0

这更清晰。 – thezhaba 2011-05-11 05:22:03

+0

谢谢你这么好,很容易解释 – spt025 2015-06-10 06:03:41