【问题标题】:What does the code "DECLDIR __declspec(dllexport)" really do?代码“DECLDIR __declspec(dllexport)”的真正作用是什么?
【发布时间】:2010-02-20 07:43:32
【问题描述】:
#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) 的真正作用是什么?

【问题讨论】:

  • @deepak:欢迎来到StackOverflow!我格式化了您的代码(选择它并按 Ctrl+K)。

标签: c file dll


【解决方案1】:

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

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

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

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

虽然您没有询问__declspec(dllimport),但情况恰恰相反。当调用不同 DLL 中的函数时,您的 DLL 需要知道它是不同 DLL 的公共接口的一部分,以便它可以正确处理调用(调用不同 DLL 中的函数需要比自己调用函数更复杂的代码)。

【讨论】:

  • 感谢您提供如此简单易懂的解释
【解决方案2】:

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

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

如果一个类被标记 declspec(dllexport),任何 类模板的特化 类层次结构是隐含的 标记为 declspec(dllexport)。这 意味着模板是明确的 实例化并且它的成员必须是 已定义。

__declspec,顺便说一下,是explained here

【讨论】:

    猜你喜欢
    • 2016-03-25
    • 2012-02-10
    • 2018-08-05
    • 1970-01-01
    • 2023-01-26
    • 2012-04-14
    • 2015-02-24
    • 1970-01-01
    • 2011-11-23
    相关资源
    最近更新 更多