C++ C++;类的单独编译器(vtables)?

C++ C++;类的单独编译器(vtables)?,c++,multiple-inheritance,vtable,C++,Multiple Inheritance,Vtable,我想知道用一个不允许多重继承的编译器编译一个类a,然后编译一个支持多重继承的类B(以及从类a派生的类B),会有什么后果 我真的不了解链接过程……是否可以同时使用这两种方法?在这种情况下,使用vtables单独使用编译器存在哪些缺点?使用类B的代码是否不可能正常工作 谢谢。 < P>作为一般规则,不要曾经>强>编译不同编译器的C++程序的部分。 不同的编译器可能会使用,而且经常会使用,不同的模式来处理符号混乱阶段,所以单独编译的东西之间的链接不太可能起作用 请参阅文档“关于损坏”对象布局(vtab

我想知道用一个不允许多重继承的编译器编译一个类a,然后编译一个支持多重继承的类B(以及从类a派生的类B),会有什么后果

我真的不了解链接过程……是否可以同时使用这两种方法?在这种情况下,使用vtables单独使用编译器存在哪些缺点?使用类B的代码是否不可能正常工作


谢谢。

< P>作为一般规则,不要<强>曾经>强>编译不同编译器的C++程序的部分。 不同的编译器可能会使用,而且经常会使用,不同的模式来处理符号混乱阶段,所以单独编译的东西之间的链接不太可能起作用


请参阅文档“关于损坏”

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

不仅仅是类不能相互通信。由于名称混乱,在头中声明但仅由其中一个编译器编译的裸函数将对另一个编译器不可见


此外,编译器编译的任何静态类/类的成员如果未编译main(),则不会正确初始化,因为编译器的运行时将不会执行。甚至像64位长算术(在32位平台上)这样的东西也可能由于运行库冲突而无法正确链接。

作为Arkaitz上述文章的补充,您可能会发现其他问题,这些问题可能会阻止使用不同编译器构建的编译单元的代码协同工作:

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

  • <>基本上,无论是C++还是C++标准,都没有什么特别的东西,使得编译器之间存在差异,因此,混合它们的问题的范围也在

    中,另外,VTABLE实现、异常处理等(整个C++ ABI)可能会有所不同。谢谢大家的关注。我永远不会这样做。如果使用共享对象/DLL,就有可能这样做。然后有一个通用的链接约定,以便不同的编译器可以一起工作。如果您在应用程序中使用来自外部供应商的DLL,您不知道他们使用的是什么编译器。您必须将应用程序拆分为“组件”共享对象/DLL。@大卫:这是错误的。使二进制文件兼容的唯一方法是使用“C”ABI(定义良好)。这意味着不共享C++结构方法/函数或类。您可以共享DLL的唯一原因是VS编译器(cl)无处不在。可以总结为:每个编译器制造商都可以定义自己的ABI。由于ABI中的差异使得来自一个编译器的代码不能被另一个编译器使用,这使得这个过程不能使用。事实上,使用使用相同编译器和不同标志编译的代码可能会导致相同的问题(调试和发布二进制文件与某些编译器不兼容)。因此,从技术上讲,所有编译单元都应该使用相同的编译器,使用相同的标志进行编译(否则您会自找麻烦)。