C ++用于类的独立编译器(vtables)?

时间:2009-11-05 13:20:50

标签: c++ multiple-inheritance vtable

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

我真的不明白链接过程......是否可以同时使用它们?在这种情况下使用单独的编译器有什么不利之处?使用B类的代码是否无法正常运行?

感谢。

4 个答案:

答案 0 :(得分:10)

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

不同的编译器可能会使用并经常执行符号修改阶段的不同修改模式,因此单独编译的内容之间的链接不太可能起作用。

请参阅有关修改name_mangling

的文档

答案 1 :(得分:3)

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

答案 2 :(得分:2)

不仅仅是那些无法相互交谈的课程。在标题中声明但仅由其中一个编译器编译的裸函数对于其他编译器是不可见的,因为名称会被修改。

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

答案 3 :(得分:2)

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

  1. 数据大小问题(例如,一个编译器使用32位整数,另一个64位)
  2. 数据对齐问题
  3. 堆内存问题
  4. 基本上C ++ / C标准对事物不是非常具体的地方留下了编译器之间差异的范围,因此混合它们的问题的范围