2

我想知道用一个不允许多重继承的编译器编译 A 类,并编译支持它的 B 类(以及从 A 类派生的 B 类)的后果是什么。

我不太了解链接过程...可以同时使用两者吗?在这种情况下使用单独的编译器和 vtables 存在哪些缺点?使用 B 类的代码是否无法正常运行?

谢谢。

4

4 回答 4

10

作为一般规则,永远不要使用不同的编译器编译 C++ 程序的某些部分。

不同的编译器可能使用并且经常使用不同的修饰模式来进行符号修饰阶段,因此单独编译的东西之间的链接不太可能起作用。

请参阅有关 mangling name_mangling 的文档

于 2009-11-05T13:29:21.523 回答
3

不保证编译器之间的对象布局(vtable 指针位置、vtable 格式、子对象放置等)相同。

于 2009-11-05T13:35:40.783 回答
2

这不仅仅是不能互相交谈的班级。由于名称修改,在头文件中声明但仅由其中一个编译器编译的裸函数将对另一个编译器不可见。

此外,由编译器编译但不编译 main() 的任何静态类/类成员都不会正确初始化,因为不会执行该编译器的运行时。由于运行时库冲突,即使是 64 位长算法(在 32 位平台上)也可能无法正确链接。

于 2009-11-05T13:35:46.260 回答
2

作为上述 Arkaitz 帖子的附录,您可能会发现其他问题可能会阻止使用不同编译器构建的编译单元的代码协同工作:

  1. 数据大小问题(例如,一个编译器使用 32 位整数,另一个编译器使用 64 位)
  2. 数据对齐问题
  3. 堆内存问题

基本上任何 C++/C 标准对事物不是很具体的地方都为编译器之间的差异留下了空间,因此也为混合它们的问题留下了空间

于 2009-11-05T13:37:30.080 回答