【问题标题】:Strange syntax error reported in a range-based for loop在基于范围的 for 循环中报告了奇怪的语法错误
【发布时间】:2014-03-06 01:01:12
【问题描述】:

在 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。
  • 你的代码不是读成for (auto x : xs) { do; } while(0);吗?
  • 使用 g++ 4.8 编译。
  • @billz 我很确定它被解析为for (auto x : xs) { do; while(0);},否则它应该是一个错误,因为do 本身不是一个有效的关键字。他在do ... while 中有一个空的声明。
  • billz - 我希望如此,因为您的代码在我的编译器中给出了相同的错误。但如果是这样,它一定是一个错误,因为 do-loop 必须有一段时间,并且整个循环应该被解析为单个语句..

标签: c++ visual-c++ c++11 visual-c++-2013


【解决方案1】:

总结未来任何人的cmets:

这显然是 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;
}

感谢大家的帮助。

【讨论】:

  • FTR,这已在 Visual Studio 2015 中修复 blogs.msdn.com/b/vcblog/archive/2015/07/01/…
  • 但是我在 Visual Studio 2015 中仍然遇到这个问题(我刚刚更新到 Update 2,它仍然存在)
  • @kovarex,我无法在 VS2015 社区更新 2 中确认此错误。它可以毫无问题地编译初始代码示例。但似乎VS2015自动代码格式化程序存在缩进问题。我想说的是小麻烦。
猜你喜欢
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
相关资源
最近更新 更多