我搜索了一些关于DLL的C ++(COM-like)ABI接口的文章, 例如:"Exporting C++ classes from a DLL"和"Binary-compatible C++ Interfaces",他们非常友善和乐于助人,但他们没有谈论命名空间。
命名空间是否会破坏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 - 编译器之间的二进制兼容接口,它不是关于两个命名空间,它是关于两个或更多编译器。
答案 0 :(得分:2)
必须。由于两个函数可以在命名空间之外相同,因此ABI必须能够区分这两个函数。即他们必须有独特的名字。因此,更改命名空间会删除一个函数并引入另一个函数,编译器不知道两者之间的关系。编译器不会读取您的Git或SVN注释。