C++ 11向后兼容性

Bri*_*ker 22 c++ gcc libstdc++ c++11

我可以使用c ++ 11中的任何东西并期望编译的二进制文件在旧系统上运行吗?如何判断c ++ 11的哪些部分是libstdc ++的一部分.那么实际编译成二进制文件的是什么?也许我不完全理解这些事情是如何起作用的.c ++ 11是否会破坏ABI与旧库的兼容性?

清晰的一个例子:

假设我编译了一个使用auto的程序和基于for循环的新范围.这些东西看起来应该适用于具有旧c ++运行时的系统,因为它们分解为在这些机器上有效的c ++.但是,使用像regex这样的东西应该在旧系统上中断,因为它不会在运行时.

我还没有测试过我的理论,因为我无法访问兼容c ++ 11的编译器,而且我的谷歌搜索也没有用.

Jed*_*aaf 13

你是对的.代码本身编译为可以在任何具有C++编译器的平台上运行.新的语言构造(远程for,新的关键字auto等)使用新的编译器进行编译,以便在旧系统上正常工作.

但是,如果您尝试将使用新符号(如正则表达式)的代码链接到旧库,则无论您是静态链接还是动态链接,都会遇到问题,因为旧库没有新符号.

假设您的代码使用新符号:

  • 如果静态链接到旧库,则链接将失败,因为旧库中不存在新符号.
  • 如果动态链接到旧库,则仍然会出现链接器问题,因为库不包含新符号.
  • 如果静态链接到新库,则生成的二进制文件将在较旧的系统上运行.
  • 如果您动态链接到新库,则生成的二进制文件将在旧系统上运行(如果已有新库)或者使用二进制文件分发新库.
    • 但是,如果您尝试用旧的动态库替换新的动态库,它将无法链接到该库中的新符号,因为它们不在那里.

  • 功能无关紧要。行为和内存布局才是真正重要的。要使用任何给定的对象,需要一个创建它的库。参见@David Rodriguez的评论。 (2认同)