#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)
真正做了什么?
答案 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)。这个 表示模板是明确的 实例化,其成员必须 定义
__declspec
是explained here。