命名空间破坏ABI吗
Does namespace break ABI?
我搜索了一些关于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评论。
相关文章:
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- CUDA内核和数学函数的显式命名空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 是否可以将函数导入命名空间,但不能导出它?
- C++ C++类中的命名空间降级
- 如何使用 soong 命名空间来有条件地编译模块
- 使用 Clang++ 有没有办法将文件作为命名空间等包含?
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何通过命名空间调用非静态方法
- 命名空间破坏ABI吗