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

    在Windows平台下:

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

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

    #define DllExport   __declspec( dllexport )
    
    class DllExport C {
       int i;
       virtual int func( void ) { return 1; }
    };

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

    dllexport类

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

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

    dllimport类

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

    继承和可导出的类

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

    选择成员导入/导出

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    .net注册iis
    hdu 1081To The Max
    hdu 1312Red and Black
    hdu 1016Prime Ring Problem
    hdu 1159Common Subsequence
    hdu 1372Knight Moves
    hdu 1686Oulipo
    hdu 1241Oil Deposits
    hdu 1171Big Event in HDU
    hdu 4006The kth great number
  • 原文地址:https://www.cnblogs.com/2018shawn/p/11082299.html
Copyright © 2011-2022 走看看