您的代码实际上等同于以下 C 代码:
struct MyStruct {
int a;
int b;
};
void WINAPI InitMyStruct(struct MyStruct* p, int a, int b)
{
p->a = a; p->b = b;
}
void WINAPI MyStruct_SetA(struct MyStruct* p, int a)
{
p->a = a;
}
避免使用虚函数基本上一无所获;这些“等效”C 函数将被调用什么(“名称修饰”)仍然取决于编译器,因此您需要使用兼容的编译器。这个千年以来的所有版本的 MSVC 在这方面都相互兼容。这个千年以来的所有版本的 GCC 都相互兼容。只是不要将两者混为一谈(会发生链接时错误)。
还有其他问题来源:
确保您的打包/对齐设置匹配(但他们也需要为纯 C 接口执行此操作)。
如果您在一个 DLL 中使用“new”,而在另一个 DLL 中使用“delete”,则可能会遇到麻烦,除非您使用完全相同的编译器版本并使用 DLL 运行时库。所以不要new
或delete
你的 MyStruct 对象来自客户端代码;相反,在 DLL 中提供函数来为您执行此操作。
远离界面中的标准库容器。如果 DLL 和客户端没有链接到同一个标准库,它们将无法工作。
不要害怕虚函数。
注意:所有这些问题在理论上也存在于其他平台上,但在 Linux 和 Mac OS X 的实践中似乎不太相关。