0-10 配置编译器:编译器扩展
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,依次点击文件(Mac 用户请点击代码)> 首选项 > 设置。这将打开设置对话框。
- 在搜索栏输入 insert final newline。
- 在工作区设置和用户设置选项卡中,确保勾选标记为文件:插入末尾换行符的复选框。
相关内容:
Xcode用户可参考Rory的评论,他提供了详细的操作指南。
关于如何在Xcode中添加编译器标志的说明:
1. 在Xcode中按下CMD+1显示项目导航器。
2. 在项目导航器中点击蓝色文件图标的项目。
3. 在主编辑窗口中选择目标。
4. 点击“构建设置”。
5. 确保选中“全部”和“组合”选项。
6. 在搜索框输入“c++ flag”。
此时应在“自定义编译器标志”标题下看到“其他C++标志”选项。
双击该行右侧,弹出小窗口。
点击“+”按钮,输入“-std=c++17”后按Enter保存。
再次点击“+”,输入“-pedantic-errors”并按Enter。
完成!点击关闭弹窗即可看到两项标志已添加至“其他C++标志”设置。您也可单击右侧区域,此时编辑框将直接显示为可编辑文本区域,只需在单行内用空格分隔输入所有标志即可。请在$(OTHER_CFLAGS)后保留空格,并将新标志添加至末尾。切勿删除$(OTHER_CFLAGS)!
注1:
在Xcode 11.3构建设置中,警告策略标题下设有“严格警告”和“将警告视为错误”选项。但将两者均设为“是”时,似乎仅会添加“-pedantic”标志,而非我们需要的“-pedantic-errors”。目前尚不确定是程序缺陷还是设计使然,建议暂时将两项均设为“否”,并采用上述自定义编译器标志设置。
注2:
存在名为“C++语言方言”的构建设置。在搜索框输入“dialect”即可找到该项。点击下拉菜单选择C++17,编译器将自动接收“-std=c++1z”参数,无需手动添加至自定义标志设置。
编辑补充:经查证,C++1z是C++17标准草案阶段的命名。
重要提示:
这些设置仅适用于当前项目。每次创建新项目时都需要重新设置,或者一次性创建包含这些设置的模板项目,后续新建项目时直接使用该模板。





浙公网安备 33010602011771号