zoukankan      html  css  js  c++  java
  • C++ 类中使用dllimport和dllexport

    在Windows平台下:

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

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

    1 #define DllExport   __declspec( dllexport )
    2 
    3 class DllExport C 
    4 {
    5    int i;
    6    virtual int func( void ) { return 1; }
    7 };

    请注意,禁止在可导出类的成员上显式使用 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时生成警告(如果此定义与类声明中指定的定义不同)。

  • 相关阅读:
    一句话说说java设计模式
    说说JVM中的操作码
    说说javap命令
    java中的类加载器
    浅谈幂等
    InstallShield Limited Edition for Visual Studio 国内注册时国家无下拉框解决方法
    Winform程序部署方式总结二——Windows Installer发布
    Winform程序部署方式总结一——ClickOnce发布
    WebService部署服务器调试时提示 “测试窗体只能用于来自本地计算机的请求”解决方法
    MVC绕过登陆界面验证时HttpContext.Current.User.Identity.Name取值为空问题解决方法
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/12307173.html
Copyright © 2011-2022 走看看