Visual Studio 2022社区版为何能编译非标准C++ for each代码?
为什么Visual Studio Community 2022会编译我的C++代码?
问题复现
下述不符合标准C语法的代码,在指定C17标准的情况下可被MSVC正常编译:
#include <list> #include <iostream> int main(int argc, char* argv[]) { std::list<int> collection = { 1, 2, 3, 4, 5, 6 }; for each (auto i in collection) { std::cout << i; } return 0; }
使用的编译命令为:cl /EHsc /std:c++17 .\programm.cpp
其中for each (auto item in collection)写法来自编辑器自动补全,检索相关资料时仅能找到该语法编译失败的案例,无对应原因说明。
核心原因
for each, in是MSVC(微软Visual C编译器)长期支持的私有非标准扩展语法,不属于任何版本的ISO C官方标准,从VC++2005版本开始就被内置支持,用于遍历可迭代集合、枚举类型对象。
你指定/std:c++17开关后仍能正常编译的原因如下:
/std:c++17编译开关的作用仅为开启C++17标准要求的全部语言特性,默认不会禁用MSVC自带的非标准兼容扩展,因此这套私有语法可以被编译器正常识别。- 编辑器自动补全提示该写法,是因为IntelliSense默认适配MSVC的扩展语法集,不会将其标记为非法语法。
网上能检索到的该语法编译失败的案例,基本分为两类:一是使用GCC、Clang等不支持微软这套私有扩展的C++编译器;二是编译时开启了严格标准兼容模式,主动禁用了非标准扩展。
严格标准模式配置方法
如果需要让编译器严格遵循ISO C++标准,直接拦截这类非标准写法,可以在编译命令中增加/permissive-开关,开启严格标准兼容模式,调整后的编译命令如下:cl /EHsc /std:c++17 /permissive- .\programm.cpp
添加该开关后,再编译包含for each非标准语法的代码,编译器会直接抛出语法错误,和其他标准兼容编译器的行为保持一致。
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

