命名空间是否会破坏ABI?

时间:2014-04-29 10:53:05

标签: c++ dll abi

我搜索了一些关于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 - 编译器之间的二进制兼容接口,它不是关于两个命名空间,它是关于两个或更多编译器。

1 个答案:

答案 0 :(得分:2)

必须。由于两个函数可以在命名空间之外相同,因此ABI必须能够区分这两个函数。即他们必须有独特的名字。因此,更改命名空间会删除一个函数并引入另一个函数,编译器不知道两者之间的关系。编译器不会读取您的Git或SVN注释。