在基于范围的for循环中报告了奇怪的语法错误

7
在 Visual Studio 2013 中,我在一个空的全新命令行解决方案中编写了以下内容:
int main(int argc, char* argv[])
{
    int xs[1];
    for (auto x : xs)
        do
            ;
        while (0);
    return 0;
}

当我编译时,出现以下错误:

error C2059: syntax error : '}'

在包含单个分号的那一行上,我是否发现了编译器错误?还是基于范围的for循环超出了我的理解范围?

可以使用Clang编译,所以我认为是个bug。 - chris
你的代码不是读作 for (auto x : xs) { do; } while(0); 吗? - billz
@JoshuaLawrence 看起来让VS2013编译这个的唯一方法是在整个“do ... while”语句周围添加大括号;或者用普通的“for”语句替换范围循环。你应该在connect.microsoft.com上提交一个错误报告。 - Praetorian
@Praetorian 不错的想法,但如果他们希望我同意八屏幕密集的法律条款来提交错误报告,他们可以去跳。或者更好的是,像我们其他人一样阅读stackoverflow。 - JoshuaLawrence
公平地说,有人在一个周末写了它。 - Yakk - Adam Nevraumont
显示剩余4条评论
1个回答

5

为了总结未来有需要的读者们的评论:

这显然是Visual Studio 2012和2013中的编译器错误。Visual Studio给出的错误消息明显是虚假的,其他编译器按预期工作。

对我来说,最简单的解决方法就是在整个do-while循环周围加上大括号:

int main(int argc, char* argv[])
{
    int xs[1];
    for (auto x : xs)
    {
        do
            ;
        while (0);
    }
return 0;
}

感谢大家的帮助。

1
这个问题在Visual Studio 2015中已经得到解决。详情请参考http://blogs.msdn.com/b/vcblog/archive/2015/07/01/c-compiler-front-end-fixes-in-vs2015.aspx。 - cdmh
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - kovarex
@kovarex,我无法确认在VS2015社区更新2中是否存在此错误。它可以编译初始代码示例而没有问题。但似乎VS2015自动代码格式化程序在缩进方面存在问题。我认为这只是小问题。 - ForNeVeR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接