2

我正在尝试使用公共类方法通过结构返回一些数据。这些结构具有简单的 c'tors 和无状态方法,有些甚至包含其他结构(尽管没有 C++/STL 类型)。类和结构将被导出到 DLL。

结构的整个定义包含在带有适当dllexportordllimport修饰符的标头中,因为它们旨在供客户使用,客户也将拥有静态导入库。

片段如下:

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 ) 的控制台应用程序

4

0 回答 0