我已经搜索了一些关于DLL的C++(类似COM)ABI接口的文章,例如:"Exporting C++ classes from a DLL" 和 "Binary-compatible C++ Interfaces",它们非常好而且有用,但是它们没有讨论命名空间。
命名空间会破坏ABI吗?
命名空间会破坏ABI吗?
namespace Foo {
class Listener {
virtual void e1() = 0;
virtual void e2() = 0;
};
class Interface {
virtual void setListener(Listener*) = 0;
virtual int f1() = 0;
virtual int f2() = 0;
};
}
extern "C" Foo::Interface* SOME_API createFooInterface();
我不知道,它能工作吗?
抱歉,我的表达不够清晰,我的英语写作能力不是很好。
在我的代码片段中,extern "C" 防止了 C++ DLL 导出的名称混淆,名称混淆在不同的 C++ 编译器之间是不兼容的,上面提到的两篇文章都在讨论这个问题。
我所说的“破坏 ABI”是指: 我可以在 MSVC 中实现这个,我可以为我的 C++ 接口类使用命名空间,我可以从这段代码中导出一个 DLL,但我不确定这个接口仍然是 ABI - 不同编译器之间的二进制兼容接口,这不是关于两个命名空间,而是关于两个或多个编译器。
Foo::Interface *
应该如何被展开为“C”链接,即没有名称修饰,并且仍然可以与例如Bar::Interface *
区分开来?createFooInterface()
函数如何返回一个C++构造(一个命名空间类型)的C函数? - DevSolarextern "C"
。那样做没有意义。 - MSalters