C++11 向后兼容性

标签 c++ gcc c++11 libstdc++

我可以使用 c++11 中的任何东西并期望编译后的二进制文件可以在旧系统上运行吗?我如何知道 c++11 的哪些部分是 libstdc++.so 的一部分,以及实际编译到二进制文件中的是什么?也许我不完全理解这些事情是如何运作的。 c++11 是否会破坏旧库的 ABI 合规性?

一个清晰的例子:

假设我编译了一个使用 auto 和基于新范围的 for 循环的程序。这些东西似乎应该在具有旧 c++ 运行时的系统上工作,因为它们分解为在这些机器上有效的 c++。但是,使用正则表达式之类的东西应该会在旧系统上中断,因为它不会在它们的运行时中。

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

最佳答案

你是对的。代码本身可以编译以在任何带有 C++ 编译器的平台上工作。新的语言结构(范围为 for、新关键字如 auto 等)使用新编译器进行编译,以便在旧系统上正常工作。

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

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

  • 如果您静态链接到旧库,则链接将失败,因为旧库中不存在新符号。
  • 如果您动态地链接到旧库,您仍然会遇到链接器问题,同样因为库不包含新符号。
  • 如果您静态链接到新库,则生成的二进制文件将在旧系统上运行。
  • 如果您动态地链接到新库,则生成的二进制文件将在旧系统上运行,前提是它已经有新库,或者如果您将新库与二进制文件一起分发。
    • 但如果您随后尝试用旧动态库替换新动态库,它将无法链接到该库中的新符号,因为它们不存在。

关于C++11 向后兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19729441/

相关文章:

c++ - 模板化转换运算符类型推导在 clang 和 gcc 中不同

c++ - 条件变量卡在等待中

c++ - 如何创建包含 n 次相同类型的类型列表(用于可变参数模板)?

c++ - 您可以将数据传递到没有指向变量的指针的空指针中吗

c++ - 如何存储坐标以便与以后的坐标进行比较

c - GCC 内联程序集 : Jump to label outside block

c++ - 初始化列表中的隐式转换失败

c++ - 将多态 unique_ptr 作为参数传递时发生内存泄漏

c++ - 在打印机上打印(windows平台32位)

c++ - 在C++类中声明参数构造函数时出错