2.2.4. c++ 兼容性

所有 Red Hat Enterprise Linux 版本 5、6 和 7 以及 Red Hat Developer Toolset 版本 1 到 10 的所有编译器均与 C++98 模式中的任何其他编译器兼容。

C++11、C++14 或 C++17 模式中的编译器只能保证在同一模式下与另一编译器兼容。

支持的示例:

  • Red Hat Developer Toolset 6.x 中的 C++11 和 C++11
  • Red Hat Developer Toolset 6.x 中的 C++14 和 C++14
  • 来自 Red Hat Developer Toolset 10.x 的 C++17 和 C++17
重要
  • Red Hat Developer Toolset 10.x 中的 GCC 编译器可以使用 C++20 构建代码,但这个功能是实验性的,且不受红帽支持。
  • 本节所述的所有兼容性信息都仅适用于 GCC C++ 编译器的红帽版本。

2.2.4.1. C++ ABI

使用 -std=c++98 或 -std=gnu++98 或 -std=gnu++98 可自由混合使用 Red Hat Enterprise Linux 5、6 或 7 系统 GCC 构建的、与 Red Hat Developer Toolset 工具链构建的 C++98 的二进制文件或库。

Red Hat Developer Toolset 11.0 的默认语言标准设置是 C++17,具有 GNU 扩展,相当于使用选项 -std=gnu++17

当使用 Red Hat Developer Toolset 6 或更高版本构建时,Red Hat Developer Toolset 中支持使用 C++14 语言版本,所有使用相应标志编译的 C++ 对象。C++98 中由系统 GCC 编译的对象也兼容,但在 C++11 或 C++14 模式中,使用系统 GCC 编译的对象不兼容。

从 Red Hat Developer Toolset 10.x 开始,使用 C++17 语言版本不再是实验性的,由红帽提供支持。所有使用 C++17 编译的 C++ 对象必须使用 Red Hat Developer Toolset 10.x 或更高版本构建。

重要

使用应用程序中的 C++11、C++14 和 C++17 功能需要仔细考虑上述 ABI 兼容性信息。

使用 Red Hat Developer Toolset 中的 GCC 明确支持由 Red Hat Enterprise Linux 7 系统工具chain GCC 构建的对象、二进制文件和库的组合。

除了上面讨论的 C++11、C++14 和 C++17 ABI 外,Red Hat Enterprise Linux 应用程序兼容性规范 不会改变用于 Red Hat Developer Toolset。当使用通过 Red Hat Enterprise Linux 7 工具链(一个 .o/.a 文件)构建的 Red Hat Developer Toolset 工具链结合使用时,Red Hat Developer Toolset 工具链应用于任何链接。这样可确保只由 Red Hat Developer Toolset 提供的更新库功能会在链接时解析。

添加了一个新的标准控制 SIMD vector 类型,以避免在有向量不同长度的系统中进行名称冲突。Red Hat Developer Toolset 中的编译器默认使用新的 mangling。通过在 GCC C++ 编译器调用中添加 -fabi-version=2-fabi-version=3 选项,可以使用前面的标准 mangling。要显示使用旧 mangling 的代码的警告,请使用 -Wabi 选项。

在 Red Hat Enterprise Linux 7 中,GCC C++ 编译器默认仍然使用旧的 mangling,但会在支持强大别名的目标上发送别名。通过将 -fabi-version=4 选项添加到编译器调用,可以使用新的标准 mangling。要显示使用旧 mangling 的代码的警告,请使用 -Wabi 选项。

在 Red Hat Enterprise Linux 7 中,Red Hat Developer Toolset 中的 GCC C++ 编译器仍然使用 std::string 的旧参考计数实现。这是为了与 Red Hat Enterprise Linux 7 系统工具chain GCC 的兼容性。这意味着,即使使用 Red Hat Developer Toolset 编译器也是如此,即使使用 Red Hat Developer Toolset 编译器也会提供一些新的 C++17 功能,如 std::pmr::string 也是如此。