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

C++语言标准概述

随着众多不同版本的C++可用(C++98、C++03、C++11、C++14、C++17、C++20、C++23等),编译器怎么知道使用哪一个版本呢?通常情况下,编译器会选择一个默认的标准。默认的标准通常不是最新的语言标准——许多编译器默认使用C++14,这个版本缺少许多最新和最伟大的特性。

如果你希望使用不同的语言标准(你很可能想要这么做),你将不得不配置你的IDE/编译器来实现这一点。

C++标准命名规则

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

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

顺便说一句… C++11之所以有开发名称C++0x,是因为它最初预计在2010年之前发布。

选择合适的语言标准

你应该选择哪种语言标准? 在专业环境中,通常选择比最新定稿标准落后一两个版本的语言标准(例如,如果C++20是最新定稿的版本,那么意味着选择C++14或C++17)。这通常是为了让编译器制造商有机会解决缺陷,并且让新特性的最佳实践得到充分理解。在相关的情况下,这也有助于确保更好的跨平台兼容性,因为某些平台上的编译器可能不会立即提供对更新语言标准的完整支持。

对于个人项目和学习过程中,我们建议选择最新的定稿标准,这样做几乎没有什么坏处。

关于实验性特性的提示

许多编译器为即将到来的非定稿语言标准的特性提供"实验性"或"预览"支持。你的IDE可能在配置语言标准的设置中提供这个选项,或者你可以通过使用即将到来的语言标准的传统名称或开发名称手动启用它。 对非定稿语言标准特性的支持将是不完整的,可能存在bug。

作者注

本网站目前针对C++17标准,这意味着我们的课程和示例假设你的编译器能够支持C++17。对于拥有兼容编译器的人来说,有一些C++20和C++23的内容可用。 为了充分利用所有课程内容,我们建议使用你的编译器支持的最新语言标准。 如果你的编译器不支持C++17,我们建议升级到支持C++17的编译器,或者在学习时考虑使用支持C++17或更新版本的在线编译器。

提醒

当你更改语言标准(或任何其他项目设置)时,请对所有构建配置进行更改。

在不同IDE中设置语言标准

在Visual Studio中设置语言标准

截至撰写本文时,Visual Studio 2022默认使用C++14功能,这不允许使用C++17和C++20中引入的新特性。 要使用这些新特性,你需要启用更新的语言标准。不幸的是,目前没有全局设置的方法——你必须逐个项目进行设置。

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

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

Visual Studio 选择语言标准 首先,确保配置设置为"所有配置"。 从这里,你可以将C++语言标准设置为你希望使用的C++版本。

提示 我们建议选择最新的标准"ISO C++ Latest (/std:c++latest)",这将确保你可以使用你的编译器支持的尽可能多的特性。 确保你从下拉菜单中选择语言标准(不要自己输入)。

相关内容 有关Visual Studio语言标准设置的更多信息,微软有一份Visual Studio语言标准参考文档。

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

Code::Blocks可能默认使用C++11之前的语言标准。你肯定想要检查并确保启用了更现代的语言标准。 好消息是Code::Blocks允许全局设置你的语言标准,所以你只需要设置一次(而不是每个项目设置一次)。要做到这一点,请转到设置菜单 > 编译器…:

Code::Blocks 选择语言标准

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

Code::Blocks 选择语言标准

如果列表中出现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友好地留下了评论,提供了一些针对这个功能中几个bug的变通方法。

对于Code::Blocks用户

在Code::Blocks中,选择文件 -> 将项目另存为模板。给你的模板一个标题,并保存。 当你创建一个新项目时,你会在"用户模板"选项下找到这个模板。

C++标准文档

我在哪里可以查看C++标准文档? 每个C++语言标准都由一个标准文档描述,这是一个正式的技术文档,是给定语言标准的规则和要求的权威来源。标准文档不是为学习而设计的——相反,它是为编译器编写者能够准确实现新语言标准而设计的。你偶尔会看到人们在解释某件事情的工作原理时引用标准文档。 对于给定的语言标准,批准的C++标准文档并不免费提供。这里有一个链接可以购买最新的标准。

当一个新的语言标准正在开发中时,会发布草稿标准文档以供审查。这些草稿可以在网上免费获得。在批准的标准之前的最后一个草稿标准通常足够接近官方标准,可以用于大多数目的。你可以在这里找到草稿标准。

编译器支持情况

编译器经常对新语言特性的支持不完整 即使在语言标准定稿之后,支持该语言标准的编译器通常仍然对某些特性的支持缺失、部分或有bug。 如果你尝试编译一个应该可以编译但神秘地无法编译的程序,这可能是因为以下两个原因之一:

你的编译器配置为使用不支持你正在使用的特性的旧语言标准。尝试选择一个更新的语言标准并重新编译你的程序。你可以使用课程0.13 - 我的编译器正在使用哪种语言标准?来验证你是否正确配置了你的语言标准选择。

你运行的编译器版本可能对你正在使用的特性有缺失、部分或有bug的支持。

CPPReference网站跟踪每个特性的编译器支持情况。你可以在他们的主页上,右上角的"编译器支持"(按语言标准)下找到这些支持表格。例如,你可以在这里看到哪些C++23特性得到了支持。

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

关注公众号,回复"cpp-tutorial"

可领取价值199元的C++学习资料

公众号二维码

扫描上方二维码或搜索"cpp-tutorial"