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。
| Publication Year | Formal Name | Conventional name | Development name | Notes |
|---|---|---|---|---|
| 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 | Finalized (technically complete) in 2023 |
| TBD | TBD | C++26 | C++2c |
顺带一提……:
C++11的开发代号为C++0x,因为最初预计会在2010年前发布。
应选择哪种语言标准?
在专业环境中,通常会选择比最新最终标准落后一到两个版本的语言标准(例如,若C++20是最新最终版本,则选择C++14或C++17)。此做法旨在确保编译器厂商有充分时间修复缺陷,并使新特性最佳实践得到充分验证。在相关场景下,此举还能提升跨平台兼容性——部分平台的编译器可能无法立即全面支持最新语言标准。
对于个人项目及学习场景,我们建议直接采用最新最终版标准,因其几乎不存在负面影响。
提示:
许多编译器为即将发布的非最终语言标准中的特性提供“实验性”或“预览”支持。您的集成开发环境(IDE)可能在语言标准配置设置中提供此选项,或者您也可以通过输入该语言标准的约定名称或开发代号手动启用。对非最终语言标准特性的支持通常不完整且可能存在缺陷。
提醒:
更改语言标准(或其他项目设置)时,请确保对所有构建配置进行相应修改。
在 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支持全局设置语言标准,因此只需设置一次(而非按项目设置)。操作路径:菜单栏 > 设置 > 编译器…:

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

如果列表中出现 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++语言标准都由一份[标准文档](standards document)描述,该文档是正式的技术文件,是特定语言标准规则和要求的权威来源。标准文档并非用于学习——而是为编译器作者准确实现新语言标准而设计。在解释某些功能的工作原理时,您偶尔会看到人们引用标准文档。
经批准的C++标准文档需付费获取。最新标准购买链接在此处。
新语言标准制定期间,会发布草案供审阅。这些草案可免费在线获取。最终批准标准之前的最新草案通常已足够接近正式标准,可满足多数使用需求。草案文档可在此处查阅。
编译器对新语言特性往往支持不完善
即使语言标准最终确定后,支持该标准的编译器对某些特性仍可能存在缺失、不完整或存在缺陷的支持。
若尝试编译的程序本应通过却莫名失败,通常源于以下两种原因:
- 您的编译器配置为使用旧版语言标准,该标准不支持您使用的特性。请尝试选择新版语言标准重新编译程序。可使用第0.13课程序——我的编译器使用何种语言标准?来验证语言标准选择配置是否正确。
- 当前编译器版本可能对所用特性存在缺失、不完整或存在缺陷的支持。
CPPReference网站按语言标准追踪各编译器对特性的支持情况。其主页右上角“编译器支持”栏目(按语言标准分类)提供了支持表链接。例如可在此查看C++23特性的支持情况。
若编译器新版支持该功能,可升级至最新版本后重新编译程序。若最新版本仍不支持所需功能,可尝试使用支持该功能的其他编译器,或采用不同功能集实现替代方案。



浙公网安备 33010602011771号