在Windows平台下:

您可以使用dllimport或dllexport属性声明C ++类。这些形式意味着导入或导出整个类。以这种方式导出的类称为可导出类。

以下示例定义可导出的类。导出其所有成员函数和静态数据:

 #define DllExport   __declspec( dllexport )

 class DllExport C
{
int i;
virtual int func( void ) { return ; }
};

请注意,禁止在可导出类的成员上显式使用 dllimport 和 dllexport 属性。

dllexport类

声明类dllexport时,将导出其所有成员函数和静态数据成员。您必须在同一程序中提供所有此类成员的定义。否则,将生成链接器错误。此规则的一个例外适用于纯虚函数,您无需为其提供显式定义。但是,因为抽象类的析构函数总是由基类的析构函数调用,所以纯虚拟析构函数必须始终提供定义。请注意,这些规则对于不可导出的类是相同的。

如果导出类类型的数据或返回类的函数,请确保导出该类。

dllimport类

声明类dllimport时,将导入其所有成员函数和静态数据成员。与dllimport和dllexport在非类类型上的行为不同,静态数据成员不能在定义dllimport类的同一程序中指定定义。

继承和可导出的类

可导出类的所有基类都必须是可导出的。如果不是,则生成编译器警告。此外,所有可访问的成员也必须是可导出的。该规则允许DLLEXPORT类从继承dllimport的类和dllimport的类从继承DLLEXPORT类(但不建议后者)。通常,DLL调用者可访问的所有内容(根据C ++访问规则)应该是可导出接口的一部分。这包括内联函数中引用的私有数据成员。

选择成员导入/导出

由于类中的成员函数和静态数据隐式具有外部链接,因此可以使用dllimport或dllexport属性声明它们,除非导出整个类。如果导入或导出整个类,则禁止将成员函数和数据显式声明为dllimport或dllexport。如果将类定义中的静态数据成员声明为dllexport,则定义必须出现在同一程序中的某个位置(与非类外部链接一样)。

同样,您可以使用dllimport或dllexport属性声明成员函数。在这种情况下,您必须在同一程序中的某处提供dllexport定义。

值得注意的是有关选择性成员导入和导出的几个要点:

  • 选择性成员导入/导出最适用于提供限制性更强的导出类接口的版本; 也就是说,您可以设计一个DLL,该DLL暴露的公共和私有功能比该语言允许的更少。它对于微调可导出接口也很有用:当您知道调用者(根据定义)无法访问某些私有数据时,您无需导出整个类。

  • 如果在类中导出一个虚函数,则必须导出所有虚函数,或者至少提供调用者可以直接使用的版本。

  • 如果您有一个使用虚拟函数选择性成员导入/导出的类,则这些函数必须位于可导出接口中或内联定义(对客户端可见)。

  • 如果将成员定义为dllexport但未将其包含在类定义中,则会生成编译器错误。您必须在类标头中定义该成员。

  • 虽然允许将类成员定义为dllimport或dllexport,但是不能覆盖类定义中指定的接口。

  • 如果在声明它的类定义主体之外的位置定义成员函数,则在函数定义为dllexport或dllimport时生成警告(如果此定义与类声明中指定的定义不同)。

C++ 类中使用dllimport和dllexport的更多相关文章

  1. 在C++类中使用dllimport和dllexport导出,

    在Windows平台下: 您可以使用dllimport或dllexport属性声明C ++类.这些形式意味着导入或导出整个类.以这种方式导出的类称为可导出类. 以下示例定义可导出的类.导出其所有成员函 ...

  2. DLL导出函数和类的定义区别 __declspec(dllexport)

    DLL导出函数和类的定义区别 __declspec(dllexport) 是有区别的, 请看 : //定义头文件的使用方,是导出还是导入 #if defined(_DLL_API) #ifndef D ...

  3. 动态链接库(dll) __declspec(dllimport) __declspec(dllexport)

    一. __declspec(dllexport) Microsoft 在 Visual C++ 的 16 位编译器版本中引入了 __export,使编译器得以自动生成导出名并将它们放到一个 .lib ...

  4. C#中的DllImport

    大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如 Windows中的一些功能,C++中已经编写好的一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在的功 ...

  5. VS下 dllimport与dllexport作用与区别

    我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++的类的话 ...

  6. dllimport与dllexport作用与区别

    我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++的类的话 ...

  7. C#(.net)中的DllImport

    大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如Windows中的一些功能,C++中已经编写好的一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在的功能 ...

  8. C#中的DllImport使用方法

    DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息 DllImport属性应用于方法,要求最少要 ...

  9. 泛型方法或泛型类中的方法是内部调用、PInvoke 或是在 COM 导入类中定义的。

    泛型基类中引用Api函数定义时static extern,在子类中会提示: 未处理TypeLoadException 泛型方法或泛型类中的方法是内部调用.PInvoke 或是在 COM 导入类中定义的 ...

随机推荐

  1. part7 vuex实现数据共享

    vuex 是数据框架(一个插件)(单项数据的改变流程,组件改数据必须先调Action用dispatch方法) 大型项目vue只能承担视图层的主要内容 大量数据传递的时候,往往需要一个数据框架辅助 例子 ...

  2. .NET CORE 热更新,否则提示DLL文件在使用中

    1.创建空目录,取名updatesite,里面放置app_ffline.htm文件,网站更新中访问使用,内容随意 2.updatesite目录下面创建Release目录,用于放置更新的dll文件 3. ...

  3. Mybatis核心类生命周期和管理

    Mybatis核心类生命周期和管理 原文链接:https://blog.csdn.net/qq1134550437/article/details/51960480 1.SqlSessionFacto ...

  4. 设计模式讲解5:FlyWeight模式源码

    声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 FlyWeight模式即享元模式.很多文本编辑器中都使用了FlyWeight模式.FlyWeight单词含 ...

  5. github新建一个单页

    比如可以在github上打开的网页是这种网址形式的:https://01xunsicheng.github.io/yumeihua/ 1.登录后首页找到 New repository 2.新建一个文件 ...

  6. http head详解

    Http普通报头:       少数报头域用于所有的请求和响应消息, 但并不用于被传输的实体 cache-Control: 用于指定缓存指令, 缓存指令是单向的 ,且是独立的(一个消息的缓存指令不会影 ...

  7. Hexo博客NexT主题美化之评论系统

    前言 更多效果展示,请访问我的博客 https://kangmingxian.github.io/ 效果图:   image Valine 诞生于2017年8月7日,是一款基于Leancloud的快速 ...

  8. 3分钟搞定高逼格PPT封底——简约型

    封底想要高逼格又简约? 发现了这五类,看完不会制作算我输.   一.纯文字 白色背景下,一段结束语,或提问或感谢.       重叠文字,看上去非常有创意. 没有操作难度,END放大字号,颜色设置为浅 ...

  9. day59-mysql-存储过程、函数、事务、锁、备份

    存储过程.函数不是重要的内容. 三. 存储过程:类似于函数(方法),简单的说存储过程是为了完成某个数据库中的特定功能而编写的语句集合, 该语句集包括SQL语句(对数据的增删改查).条件语句和循环语句等 ...

  10. vim,neovim 配置文件

    插件管理用的是 https://github.com/junegunn/vim-plug 打开网址,会有示例,如何安装它本身,以及一些插件,照做,很容易完成 里面有两个可用的配置文件,cp_vimrc ...