代码之家  ›  专栏  ›  技术社区  ›  rxmnnxfpvg

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

  •  2
  • rxmnnxfpvg  · 技术社区  · 15 年前

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

    我不太了解链接过程…是否可以同时使用两者?在这种情况下,使用单独的编译器和vtables有什么缺点?使用B类的代码是否不可能正常工作?

    谢谢。

    4 回复  |  直到 15 年前
        1
  •  10
  •   Arkaitz Jimenez    15 年前

    一般来说,不要 曾经 用不同的编译器编译你的C++程序的部分。

    对于符号管理阶段,不同的编译器可能会使用不同的管理模式,而且通常也会使用不同的管理模式,因此单独编译的内容之间的链接不太可能工作。

    见医生关于管理 name_mangling

        2
  •  3
  •   Nikolai Fetissov    15 年前

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

        3
  •  2
  •   jmucchiello    15 年前

    不仅仅是课程不能互相交流。头中声明但仅由其中一个编译器编译的裸函数对另一个编译器将不可见,因为名称有误。

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

        4
  •  2
  •   pxb    15 年前

    作为上面阿卡茨文章的一个补充,您可能会发现其他问题,这些问题可能会阻止由不同编译器构建的编译单元共同工作的代码:

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

    基本上,C++/C标准在任何事物上都不太具体,在编译器之间存在差异,因此混合了它们的范围。