代码“DECLDIR __declspec(dllexport)”真的有用吗?

时间:2010-02-20 07:43:33

标签: c file dll

#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 个答案:

答案 0 :(得分:9)

在Microsoft世界中,__declspec(dllexport)使函数或类可以从DLL外部调用。

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

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

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

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

答案 1 :(得分:1)

它将DECLDIR宏常量定义为__declspec(dllexport)dllexport用于从DLL导出函数。以下是this page的引用:

  

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

     

如果标记了一个类   declspec(dllexport),任何   中的类模板的特化   类层次结构是隐式的   标记为declspec(dllexport)。这个   表示模板是明确的   实例化,其成员必须   定义

顺便说一下,

__declspecexplained here