首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在每个成员的基础上重写类作用域__declspec(dllexport)注释?

如何在每个成员的基础上重写类作用域__declspec(dllexport)注释?
EN

Stack Overflow用户
提问于 2017-03-14 22:52:27
回答 2查看 603关注 0票数 18

在ELF目标上,如果我有class Foo,并且我通过像class __attribute__((visibiility("default"))) Foo这样的声明赋予了它default可见性,那么我可以通过用__attribute__((visibility("hidden"))显式地注释类的某些成员来有选择地免除它们具有default可见性。这对于不应该构成ABI的一部分的内联方法很有用,这样,如果在构建定义class Foo的库时发出它们,它们就不会被导出,或者对于class Foo中也不应该构成其ABI的一部分的private成员或类型。

然而,在Windows上,似乎没有实现这一点的方法。虽然未修饰的class Foo自动成为DLL的私有,一旦被装饰为class __declspec(dllexport) Foo,整个类现在是dllexport,并且似乎没有关联的批注可以选择性地重写特定成员的__dllexport状态。将选择的“不用于导出”成员标记为__declspec(dllimport)显然是错误的。

是否有其他方法可以防止类作用域__dllexport应用于特定的类成员和/或类型?

更具体地说,在使用ELF注释时,我想说的是:

代码语言:javascript
复制
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;
};

但我不能使用MSVC属性形成相同的东西:

代码语言:javascript
复制
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")))的语义并可以覆盖__declspec(dllexport)的类范围应用程序

EN

回答 2

Stack Overflow用户

发布于 2017-03-21 23:30:14

MSDN documentation给出了如何做到这一点的想法。这是一个示例。

DLL_declspec.h:

代码语言:javascript
复制
#if defined(BUILD_DLL)
   #define DLL_DECLSPEC __declspec(dllexport)
#else
   #define DLL_DECLSPEC __declspec(dllimport)
#endif

要导出整个类:

代码语言:javascript
复制
#include "DLL_declspec.h"

class DLL_DECLSPEC TestExport
{
   public:

      TestExport();

      ~TestExport();

      std::string getName();

      int getID();
};

要仅导出类中精选的几个成员,请执行以下操作:

代码语言:javascript
复制
#include "DLL_declspec.h"

class TestExport
{
   public:

      DLL_DECLSPEC TestExport();

      DLL_DECLSPEC ~TestExport();

      DLL_DECLSPEC std::string getName();

      int getID();
};
票数 1
EN

Stack Overflow用户

发布于 2017-03-16 23:43:25

我从来没有做过这样的事情,但是遵循the MSDN documentation应该是可能的。

不应在类级别上指定任何__declspec,而应仅为所需的成员指定__declspec(dllexport)

希望这能有所帮助。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42789289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档