在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注释时,我想说的是:
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属性形成相同的东西:
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)
的类范围应用程序
发布于 2017-03-21 23:30:14
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();
};
发布于 2017-03-16 23:43:25
我从来没有做过这样的事情,但是遵循the MSDN documentation应该是可能的。
不应在类级别上指定任何__declspec
,而应仅为所需的成员指定__declspec(dllexport)
。
希望这能有所帮助。
https://stackoverflow.com/questions/42789289
复制相似问题