谁能解释一下__declspec关键字的用法和作用

expedition 2005-12-08 02:24:51
我看msdn时看不打懂,请懂行的人帮我解释一下。谢谢!!!
...全文
210 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
bjxiaoye 2005-12-08
  • 打赏
  • 举报
回复
from MSDN:

Visual C++ 概念:添加功能

使用 __declspec(dllexport) 从 DLL 导出
Microsoft 在 Visual C++ 的 16 位编译器版本中引入了 __export,使编译器得以自动生成导出名并将它们放到一个 .LIB 文件中。然后,此 .LIB 文件就可以像静态 .LIB 那样用于与 DLL 链接。

在 32 位编译器版本中,可以使用 __declspec(dllexport) 关键字从 DLL 导出数据、函数、类或类成员函数。__declspec(dllexport) 将导出指令添加到对象文件,因此您不需要使用 .DEF 文件。

当试图导出 C++ 修饰函数名时,这种便利最明显。对名称修饰没有标准规范,因此导出函数的名称在不同的编译器版本中可能不一样。如果使用 __declspec(dllexport),仅当解决任何命名约定更改时才需要重新编译 DLL 和依赖 .EXE 文件。

许多导出指令(如序号、NONAME 和 PRIVATE)只能在 .DEF 文件中创建,并且没有不使用 .DEF 文件指定这些属性的方法。不过,在 .DEF 文件的基础上另外使用 __declspec(dllexport) 不会导致生成错误。

若要导出函数,__declspec(dllexport) 关键字必须出现在调用约定关键字的左边(如果指定了关键字)。例如:

__declspec(dllexport) void __cdecl Function1(void);
若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边,如下所示:

class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };
生成 DLL 时,通常创建一个包含正在导出的函数原型和/或类的头文件,并将 __declspec(dllexport) 添加到头文件中的声明。若要提高代码的可读性,请为 __declspec(dllexport) 定义一个宏并对正在导出的每个符号使用该宏:

#define DllExport __declspec( dllexport )
__declspec(dllexport) 将函数名存储在 DLL 的导出表中。如果希望优化表的大小,请参见按序号而不是按名称从 DLL 导出函数。

注意 将 DLL 源代码从 Win16 移植到 Win32 时,用 __declspec(dllexport) 替换 __export 的每个实例。
作为参考,在 Win32 WINBASE.H 头文件中搜索。它包含 __declspec(dllimport) 的用法示例。
freemme 2005-12-08
  • 打赏
  • 举报
回复
大多数情况是用于函数的导入导出
duyhui 2005-12-08
  • 打赏
  • 举报
回复
函数导出时使用
oyljerry 2005-12-08
  • 打赏
  • 举报
回复
结合dllexport等进行函数导出

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧