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

dee*_*pak 6 c dll file

#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
Run Code Online (Sandbox Code Playgroud)

代码到底是DECLDIR __declspec(dllexport)做什么的?

R S*_*hko 9

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

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

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

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

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


Eli*_*sky 1

它将DECLDIR宏常量定义为__declspec(dllexport)dllexport用于从 DLL 导出函数。这是此页面的引用:

这些属性显式定义 DLL 与其客户端的接口,客户端可以是可执行文件或另一个 DLL。将函数声明为 dllexport 消除了对模块定义 (.DEF) 文件的需要,至少在导出函数的规范方面是如此。请注意,dllexport 替换了 __export 关键字。

如果类被标记为 declspec(dllexport),则类层次结构中类模板的任何特化都会隐式标记为 declspec(dllexport)。这意味着模板是显式实例化的,并且必须定义其成员。

__declspec顺便在这里解释一下