如何基于每个成员覆盖类作用域__declspec(dllexport)注释?

时间:2017-03-14 14:52:27

标签: c++ visual-c++ dll visibility elf

在ELF目标上,如果我有class Foo并且我通过default之类的声明给它class __attribute__((visibiility("default"))) Foo可见性,那么我可以有选择地豁免该类的某些成员default 1}}通过__attribute__((visibility("hidden"))显式地注释它们来实现可见性。这对于不应构成ABI一部分的内联方法非常有用,因此如果在构建定义class Foo的库时发出它们,则不会导出它们,也不会导出private成员或类型中的class Foo成员或类型{1}}也不应成为其ABI的一部分。

然而,在Windows上,似乎没有办法实现这一目标。虽然未加修饰的class Foo自动为DLL私有,但一旦装饰为class __declspec(dllexport) Foo,整个类现在为dllexport,并且似乎没有关联的注释可以有选择地覆盖{{ 1}}特定成员的状态。将选择“不用于导出”的成员标记为__dllexport显然是错误的。

是否有其他方法可以阻止类作用域__declspec(dllimport)应用于某些类成员和/或类型?

为了使这更具体,我想说的,并且可以说,当使用ELF注释时:

__dllexport

但我无法使用MSVC属性形成相同的东西:

class __attribute__((visibility("default"))) Foo {
public:
    Foo(); // OK, default visibility

    // Don't let inlines join the ABI
    __attribute__((visibility("hidden")) inline void something() { ... }

private:
    // Don't let private members join the ABI
    __attribute__((visibility("hidden")) void _internal();

    // Our pImpl type is also not part of the ABI.
    struct __attribute__((visibility("hidden")) pimpl;
};

在现实世界的实现中,我希望它们之间的差异隐藏在宏之后。

是否有一些我忽略的class __declspec(dllexport) Foo { public: Foo(); // OK, dllexport'ed // Don't let inlines join the ABI, but how to say it? __declspec(???) inline void something() { ... } private: // Don't let private members join the ABI, but how? __declspec(???) void _internal(); // Our pImpl type is also not part of the ABI, but how? struct __declspec(???) pimpl; }; 具有__declspec的语义并且可以覆盖__attribute__((visibility("hidden")))的类范围应用程序?

2 个答案:

答案 0 :(得分:2)

MSDN documentation提供了如何完成它的想法。这是一个样本。

DLL_declspec.h:

#if defined(BUILD_DLL)
   #define DLL_DECLSPEC __declspec(dllexport)
#else
   #define DLL_DECLSPEC __declspec(dllimport)
#endif

导出全班:

#include "DLL_declspec.h"

class DLL_DECLSPEC TestExport
{
   public:

      TestExport();

      ~TestExport();

      std::string getName();

      int getID();
};

只导出一些精心挑选的班级成员:

#include "DLL_declspec.h"

class TestExport
{
   public:

      DLL_DECLSPEC TestExport();

      DLL_DECLSPEC ~TestExport();

      DLL_DECLSPEC std::string getName();

      int getID();
};

答案 1 :(得分:0)

我从未做过这样的事情,但是the MSDN documentation之后应该有可能。

您不应在类级别指定任何__declspec,并且只为所需的成员指定__declspec(dllexport)

希望得到这个帮助。