C++ 标准定义了程序在特定情况下应如何行为的规则。在大多数情况下,编译器会遵循这些规则。然而,许多编译器会实现自己对语言的更改,通常是为了增强与语言其他版本(例如 C99)的兼容性,或出于历史原因。这些特定于编译器的行为称为编译器扩展。
编写使用编译器扩展的程序会使你编写的程序与 C++ 标准不兼容。使用非标准扩展的程序通常无法在其他编译器(不支持这些扩展的编译器)上编译,即使编译成功,也可能无法正确运行。
令人沮丧的是,编译器扩展通常默认启用。这对新学习者来说尤其有害,他们可能认为某些有效的行为是官方 C++ 标准的一部分,而实际上他们的编译器只是过于宽松。
因为编译器扩展永远不是必需的,并且会导致你的程序不符合 C++ 标准,所以我们建议关闭编译器扩展。
最佳实践
禁用编译器扩展,以确保你的程序(和编码实践)符合 C++ 标准,并且可以在任何系统上运行。
禁用编译器扩展
对于 Visual Studio 用户
要禁用编译器扩展,请在解决方案资源管理器窗口中右键单击你的项目名称,然后选择属性

在项目对话框中,首先确保配置字段设置为所有配置。
然后,点击C/C++ > 语言选项卡,并将符合模式设置为是 (/permissive-)(如果它默认不是这个设置)。

对于 Code::Blocks 用户
通过设置菜单 > 编译器 > 编译器标志选项卡禁用编译器扩展,然后找到并勾选-pedantic-errors选项。

对于 gcc 和 Clang 用户
你可以通过在编译命令行中添加-pedantic-errors标志来禁用编译器扩展。
对于 VS Code 用户
- 打开 tasks.json 文件,找到
"args"
,然后在该部分中找到"${file}"
行。 - 在
"${file}"
行上方,添加一行包含以下命令的新行
"-pedantic-errors",
截至撰写本文时,VS Code 不会自动在缺少换行符的代码文件末尾添加换行符(这是 C++ 标准严格要求的)。幸运的是,我们可以告诉 VS Code 这样做
- 打开 VS Code 并转到文件(如果使用 Mac 则是 Code)> 首选项 > 设置。这将打开一个设置对话框。
- 在搜索栏中输入
insert final newline
。 - 在工作区设置和用户设置选项卡中,确保勾选标有文件:插入最终换行符的复选框。
相关内容
Xcode 用户可以参考Rory 的评论,他慷慨地提供了说明。
提醒
这些设置是按项目应用的。你每次创建新项目时都需要设置它们,或者一次创建一个带有这些设置的模板项目,然后用它来创建新项目。