命名空间破坏ABI吗

Does namespace break ABI?

本文关键字:ABI 命名空间      更新时间:2023-10-16

我搜索了一些关于DLL的C++(类COM(ABI接口的文章,例如:"从DLL导出C++类"answers"二进制兼容C++接口",它们非常好,也很有用,但它们没有谈论命名空间。

命名空间破坏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-编译器之间的二进制兼容接口,它不是关于两个名称空间,而是关于两个或多个编译器。

必须这样做。由于两个函数可以在命名空间之外完全相同,ABI必须能够区分这两个函数。也就是说,他们必须有唯一的名字。因此,更改名称空间会删除一个函数并引入另一个函数,编译器不知道两者之间的关系。编译器不会阅读你的Git或SVN评论。