You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:42:13