在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")))
的类范围应用程序?
答案 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)
。
希望得到这个帮助。