我正在尝试使用公共类方法通过结构返回一些数据。这些结构具有简单的 c'tors 和无状态方法,有些甚至包含其他结构(尽管没有 C++/STL 类型)。类和结构将被导出到 DLL。
结构的整个定义包含在带有适当dllexport
ordllimport
修饰符的标头中,因为它们旨在供客户使用,客户也将拥有静态导入库。
片段如下:
struct __declspec(dllexport) Data
{
double dataA;
double dataB;
Data(double _a, double _b) : dataA(_a), dataB(_b) {}
double helperMethod(double param1, double param2) { return dataA + dataB; }
};
struct __declspec(dllexport) AggData
{
double dataX;
double dataY;
Data aStructData;
AggData(double _x, double _y) : dataX(_x), dataY(_y), aStructData(0.0, 0.0) {}
double helperMethod(double param1, double param2) { return dataX + dataY; }
};
class __declspec(dllexport) IModel
{
public:
virtual Data returnSomeData() = 0;
virtual AggData returnSomeOtherData() = 0;
};
class __declspec(dllexport) Model : public IModel
{
public:
Data returnSomeData();
AggData returnSomeOtherData();
};
我的主要问题是:标头和导入库是否保证客户可以按预期使用我的类,即不会因 ABI 问题而损坏数据?
这个问题及其答案似乎接近我正在寻找的内容,但没有提到导入库是否可以解决虚函数问题:
Passing struct by value from an explicit loaded dll built with a different compiler
一个相关的问题:如果我只分发没有导入库的头文件,并假设没有虚函数,是否足够使用?我认为这只是一个关于跨编译器的结构内存布局的问题,但我也不清楚。
阅读这些其他问题,但没有完全看到答案(或者如果我看到了没有意识到):
C++定义类成员结构并在成员函数中返回它
如何从DLL /导出/导入C结构到使用 __declspec( dllexport/import ) 的控制台应用程序