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的额外设置
截至撰写本文时,VS Code不会自动为缺少它的代码文件末尾添加新行(这是C++标准所严格要求的)。幸运的是,我们可以告诉VS Code这样做:
打开VS Code,转到文件(如果是Mac用户则为Code)> 首选项 > 设置。这将打开一个设置对话框。
在搜索栏中输入insert final newline。
在工作区设置和用户设置选项卡中,确保选中标记为文件:插入最终新行的复选框。
提醒
这些设置是按项目应用的。你需要在每次创建新项目时设置它们,或者创建一个带有这些设置的模板项目,并使用它来创建新项目。