如何找到我的编译器使用的 C++ 语言标准的默认版本并更改它?

Mac*_*o24 3 c++ g++ clang

我想知道当我执行类似g++ main.cpp.

我知道我可以运行g++ -v编译器版本,例如返回:

Apple clang version 14.0.0 (clang-1400.0.29.202)
Target: arm64-apple-darwin22.1.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
Run Code Online (Sandbox Code Playgroud)

但我不确定这里使用的默认 C++ 语言版本是什么。

我也知道我可以用来-std=c++(version)更改它,但是,最好将默认值设置为 c++20 以保持最新状态并且不必使用标志。

sta*_*all 9

请注意,在具有 Xcode 开发人员工具的 MacOS 上,g++ 和 clang 编译器工具集只是 Apple Clang(Apple 版本的 Clang)的别名。

如果你想通过实验找出答案,你可以使用标准__cplusplus来获取编译时使用的C++语言标准版本。只需编译一个文件,该文件执行消息杂注打印 的值,__cplusplus而无需在编译命令中指定 C++ 语言版本标志。

但您也可以阅读文档。

GCC 的默认值

请参阅其文档,在撰写本文时该文档指出(已添加重点):

自 GCC 11 以来,C++17 模式是默认模式;可以使用 -std=c++17 命令行标志或 -std=gnu++17 显式选择它以启用 GNU 扩展。一些 C++17 功能自 GCC 5 起就可用,但支持是实验性的,并且 C++17 功能的 ABI 直到 GCC 9 才稳定。

GCC 完全支持2014 C++ 标准。该模式是 GCC 6.1 直至 GCC 10(含)的默认模式;可以使用 -std=c++14 命令行标志或 -std=gnu++14 显式选择它以启用 GNU 扩展。

GCC 完全支持1998 年 C++ 标准(经 2003 年技术勘误和一些后来的缺陷报告修改),但不包括后来从该语言中删除的导出功能。该模式是 6.1 之前的 GCC 版本中的默认模式;可以使用 -std=c++98 命令行标志或 -std=gnu++98 显式选择它以启用 GNU 扩展。

另相关:使用 g++ 编译时默认使用哪种 C++ 标准?

Clang 的默认值

请参阅其文档,在撰写本文时该文档指出(已添加重点):

默认情况下,Clang 16 或更高版本根据 C++17 标准构建 C++ 代码。您可以通过 -std=c++17 选项在 C++17 模式下使用 Clang(在 Clang 4 及更早版本中使用 -std=c++1z)。

请参阅16.0 发行说明中对此的提及

过去常说:

默认情况下,Clang 根据 C++14 标准构建 C++ 代码。您可以通过 -std=c++14 选项在 C++14 模式下使用 Clang(在 Clang 3.4 及更早版本中使用 -std=c++1y)。

默认的 C++ 语言版本有时会随着 Clang 的新版本而变化,例如 Clang 6.0 中从 gnu++98 到 gnu++14 的情况

MSVC 的默认值

请参阅其有关flag的文档/std,在撰写本文时该文档指出(已添加强调):

/std:c++14
/std:c++14选项启用由 MSVC 编译器实现的 C++14 标准特定功能。此选项是编译为 C++ 的代码的默认选项。它从 Visual Studio 2015 Update 3 开始提供。

更改默认值

更改默认值的方法取决于您正在使用的其他构建工具。

除了为运行编译器的构建系统或 shell 做一些事情之外,我不知道有什么方法可以配置编译器本身。如果您确实想深入了解,您可能需要实际构建编译器的修改版本。

相关问题:Set as default C++11 in Clang


话虽如此,对于任何足够大以保证使用构建系统的代码,由于并非所有项目都具有相同的最低语言标准要求,因此最好在构建系统的配置文件中显式指定项目的编译器语言模式要求(例如,target_compile_features在 CMake 中使用),以便为项目调用构建系统的用户不必记住手动设置正确的语言标准标志,并且可以让构建系统执行所需的操作。

请记住,对于某些项目(尤其是广泛使用的库),对构建它们或使用其标头的语言标准要求较低是一个功能,因为它允许人们(由于自己的原因)不能或选择不使用较新的编译器(而是使用不支持或不完全支持新语言功能的旧语言来构建它们或包含它们的标头。