0.12 — 配置你的编译器:选择语言标准

C++ 有许多不同的版本(C++98、C++03、C++11、C++14、C++17、C++20、C++23 等),你的编译器如何知道使用哪一个?通常,编译器会选择一个默认标准。通常默认的不是最新的语言标准——许多编译器默认使用 C++14,它缺少许多最新和最棒的特性。

如果你想使用不同的语言标准(你可能会的),你需要配置你的 IDE/编译器来做到这一点。

语言标准的传统名称(例如 C++20)基于语言标准发布(或预期发布)的年份。由于实际发布年份直到临近时才确定,早期开发中的语言标准有时会使用开发名称。例如,C++20 也被称为 C++2a。

发布年份正式名称传统名称开发名称备注
2011ISO/IEC 14882:2011C++11C++0x
2014ISO/IEC 14882:2014C++14C++1y
2017ISO/IEC 14882:2017C++17C++1z
2020ISO/IEC 14882:2020C++20C++2a
2024ISO/IEC 14882:2024C++23C++2b于 2023 年定稿(技术上已完成)
待定待定C++26C++2c

题外话…

C++11 的开发名称是 C++0x,因为它最初预计在 2010 年之前发布。

你应该选择哪个语言标准?

在专业环境中,通常选择比最新定稿标准落后一到两个版本的语言标准(例如,如果 C++20 是最新定稿版本,则选择 C++14 或 C++17)。这样做通常是为了确保编译器制造商有时间解决缺陷,并且新特性的最佳实践得到充分理解。在相关情况下,这也有助于确保更好的跨平台兼容性,因为某些平台上的编译器可能无法立即完全支持较新的语言标准。

对于个人项目和学习,我们建议选择最新的定稿标准,因为这样做几乎没有缺点。

提示

许多编译器为即将到来的未定稿语言标准的特性提供“实验性”或“预览”支持。你的 IDE 可能会在配置语言标准的设置中提供此选项,或者你也可以使用即将到来的语言标准的传统名称或开发名称手动启用它。

对未定稿语言标准特性的支持将是不完整且可能存在错误的。

作者注

本网站目前以 C++17 标准为目标,这意味着我们的课程和示例假设你的编译器支持 C++17。对于那些拥有兼容编译器的用户,我们提供了一些 C++20 和 C++23 的内容。

为了充分利用所有课程内容,我们建议使用你的编译器支持的最新语言标准。

如果你的编译器不支持 C++17,我们建议升级到支持 C++17 的编译器,或者在学习时考虑使用支持 C++17 或更高版本的在线编译器。

提醒

更改语言标准(或任何其他项目设置)时,请将更改应用于所有构建配置。

在 Visual Studio 中设置语言标准

截至撰写本文时,Visual Studio 2022 默认支持 C++14,这不允许使用 C++17 和 C++20 中引入的较新特性。

要使用这些新特性,你需要启用较新的语言标准。不幸的是,目前无法全局执行此操作——你必须按项目进行。

警告

使用 Visual Studio,每次创建新项目时都需要重新选择语言标准。

要选择语言标准,请打开你的项目,然后转到“项目菜单”>“(你的应用程序名称)属性”,然后打开“配置属性”>“C/C++”>“语言”。

首先,确保“配置”设置为“所有配置”。

从那里,你可以将“C++ 语言标准”设置为你希望使用的 C++ 版本。

提示

我们建议选择最新的标准“ISO C++ 最新 (/std:c++latest)”,这将确保你可以使用编译器支持的尽可能多的特性。

请务必从下拉菜单中选择语言标准(不要手动输入)。

相关内容

有关 Visual Studio 语言标准设置的更多信息,Microsoft 提供了一份Visual Studio 语言标准参考文档

在 Code::Blocks 中设置语言标准

Code::Blocks 可能默认使用 C++11 之前的语言标准。你肯定需要检查并确保启用了更现代的语言标准。

好消息是 Code::Blocks 允许全局设置你的语言标准,所以你可以设置一次(而不是每个项目)。为此,请转到“设置菜单”>“编译器...”

Code::Blocks Settings > Compiler

然后找到标有“让 g++ 遵循 C++XX ISO C++ 语言标准 [-std=c++XX]”的复选框,其中 XX 是一个数字(例如 20、17 等),代表一个语言标准

Code::Blocks C++11 setting

如果列表中出现 C++23、C++20 或 C++17,请选择代表最新 ISO 标准的那个(例如,选择“让 g++ 遵循 C++20 ISO 语言标准”)。如果你也在此列表中看到 GNU 标准,请忽略它们。

如果此列表中没有 C++17,请升级到最新版本的 Code::Blocks。

警告

截至撰写本文时,Code::Blocks 的当前版本(20.03)正在使用过时的编译器(GCC 8.1.0)。

我们建议通过更新 MinGW 来更新你的编译器。更新过程可以在课程0.6 -- 安装集成开发环境 (IDE)的 Code::Blocks 部分找到。

提示

更新到最新版本的 MinGW 后,你可以查看“设置菜单”>“编译器...”菜单中是否出现较新的语言标准复选框。如果没有,你可以按如下方式手动选择 C++ 版本

  • 找到“全局编译器设置”对话框的“其他编译器选项”选项卡。
  • 添加以下编译器选项之一:-std=c++11-std=c++14-std=c++17-std=c++20-std=c++23(分别启用 C++11/14/17/20/23 支持)。你也可以尝试最新的代号(例如 -std=c++2c)以获得即将到来的语言标准的实验性特性支持。

在 GCC/G++/Clang 中设置语言标准

对于 GCC/G++/Clang,你可以使用编译器选项 -std=c++11-std=c++14-std=c++17-std=c++20-std=c++23(分别启用 C++11/14/17/20/23 支持)。如果你使用的是 GCC 8 或 9,你需要使用 -std=c++2a 来支持 C++20。你还可以尝试最新的代号(例如 -std=c++2c)以获得即将到来的语言标准的实验性特性支持。

为 VS Code 设置语言标准

对于 VS Code,你可以按照上述规则在 GCC/G++/Clang 中设置语言标准。

将适当的语言标准标志(包括双引号和逗号)放在 tasks.json 配置文件中,在 "args" 部分,在 "${file}" 之前单独一行。

我们还需要配置 Intellisense 使用相同的语言标准。对于 C++20,在 settings.json 中,更改或添加以下设置,单独一行:"C_Cpp.default.cppStandard": "c++20"

我的编译器目前正在使用哪个语言标准?

这已移至下一课。请参阅0.13 -- 我的编译器正在使用哪个语言标准?

导出你的配置

每次创建新项目时都必须重新选择所有设置选项是很麻烦的。幸运的是,大多数 IDE 都提供了导出设置的方法。通常通过创建一个具有所需设置的新项目模板,然后在创建新项目时选择该项目模板来完成。

对于 Visual Studio 用户

在 Visual Studio 中,此选项可通过“项目”->“导出模板”获得。选择“项目模板”,添加名称和可选描述(例如 C++20 控制台应用程序),然后单击“完成”。

下次创建新项目时,你将在项目模板列表中看到此模板。

一旦使用此模板创建新项目,它可能不会打开任何文件。你可以通过转到“解决方案”->“<项目名称>”->“源文件”->“<模板名称>.cpp”在“解决方案资源管理器”窗口中打开你的 .cpp 文件。

2025 年 2 月:读者 Mingtao Yue 慷慨地留下了一条评论,提供了此功能中一些错误的解决方法。

对于 Code::Blocks 用户

在 Code::Blocks 中,选择“文件”->“将项目另存为模板”。给你的模板一个标题,然后保存。

创建新项目时,你会在“用户模板”选项下找到此模板。

我在哪里可以查看 C++ 标准文档?

每个 C++ 语言标准都由一份**标准文档**描述,它是一份正式的技术文档,是给定语言标准规则和要求的权威来源。标准文档并非为学习而设计——相反,它旨在让编译器编写者能够准确地实现新的语言标准。你偶尔会看到人们在解释某个事物如何工作时引用标准文档。

给定语言标准的已批准 C++ 标准文档并非免费提供。购买最新标准的链接在此

当新的语言标准正在开发时,会发布草案标准文档以供审查。这些草案**可以**免费在线获取。在批准标准之前的最后一份草案标准通常与官方标准足够接近,可以用于大多数目的。你可以在此处找到草案标准。

编译器对新语言特性的支持通常不完整

即使语言标准已定稿,支持该语言标准的编译器通常仍对某些特性存在缺失、部分或有 bug 的支持。

如果你尝试编译一个应该可以编译但神秘地无法编译的程序,很可能是由于以下两个原因之一:

  • 你的编译器配置为使用不支持你正在使用的特性的旧语言标准。尝试选择一个较新的语言标准并再次编译你的程序。你可以使用课程0.13 -- 我的编译器正在使用哪个语言标准?中的程序来验证你是否正确配置了语言标准选择。
  • 你正在运行的编译器版本可能对你正在使用的特性存在缺失、部分或有 bug 的支持。

CPPReference 网站跟踪每个语言标准对每个特性的编译器支持情况。你可以在其主页右上角的“编译器支持”(按语言标准)下找到这些支持表。例如,你可以在此处查看支持哪些 C++23 特性。

如果你的编译器的新版本支持问题特性,你可以将编译器升级到最新版本并再次尝试编译你的程序。如果你的编译器最新版本仍然不支持你正在尝试使用的特性,你可以尝试使用其他提供支持的编译器,或者找到使用不同特性集解决方案。

guest
您的电子邮箱地址将不会被显示
发现错误?请在上方留言!
与勘误相关的评论在处理后将被删除,以帮助减少混乱。感谢您帮助使网站对每个人都更好!
来自 https://gravatar.com/ 的头像与您提供的电子邮箱地址相关联。
有回复时通知我:  
624 评论
最新
最早 最多投票
内联反馈
查看所有评论