视觉未声明的标识符?

时间:2012-08-28 08:48:44

标签: c++ visual-c++

我正在使用visual studio 2010,当我做类似

的事情时
for(int i = 0, j = 0; i < 10; i++)
{
        if(m_Var == 1)
            j++;
}

if(j == 0)//This line errors undeclared identifier
    DoSomething();

我在for循环中声明了j,那么为什么它会出现错误&#34;未声明的标识符&#34;?

另一个例子是

for(int i = 0; i < 10; i++)
{
        m_Var1++;
}

for(i = 0; i < 200; i++)//This line errors undeclared identifier
{
        m_Var2++;
}

即使在for循环中声明了代码错误,但为什么呢?有没有办法做到这一点,而不必在循环之前声明i但在循环中声明它,而不是像上面的例子中那样?

5 个答案:

答案 0 :(得分:5)

在第一个示例中,j仅存在于循环范围

for(int i = 0, j = 0; i < 10; i++)
{
        if(m_Var == 1) j++;
}  // i, j exist no longer

在第二个示例中,同样适用于i。它的范围是第一个循环。您甚至可以在没有循环的情况下进行检查:

{
  int i = 0;
} // end of scope, end of i

i++; // error, 

答案 1 :(得分:3)

我记得,一些非常早期版本的C ++在for循环中定义了变量,这些循环作用于包含循环的块。在现代C ++中,范围仅限于for循环本身。例如:

void foo() {
    for (int i = 0; i < N; i ++) {
        // i is visible here
    }
    // In very old C++, i is visible here.
    // In modern C++, i is not visible here.
}

Visual Studio实际上有一个选项来启用旧的行为;您可以在配置属性 - &gt;下关闭“For Loop Scope中的强制一致性”。 C / C ++ - &gt;语言。相应的编译器命令行选项为/Zc:forScope-。但除非你特别需要这个来编译你无法修复的旧代码,否则我强烈建议保留默认设置,这符合现代C ++规则。如果您正在编写新代码,请遵循现代C ++规则。如果你需要一个变量在循环外可见,那么在循环之外声明它。

答案 2 :(得分:2)

因为你在循环中声明它所以一旦循环结束,你的j变量就超出了范围。在for语句中声明变量时,如此

for(int i = 0, j = 0; i < 10; i++) 

变量只有循环范围。

答案 3 :(得分:1)

  

我已在j循环中声明for ...

是的,你有。并且你只能在for循环中使用,因为它的作用域在该循环的右括号处结束。之后你不能使用它。

如果你想在之后使用它,你必须稍微移动一下范围,但不要太远以至于它会影响其他东西(本地化仍然是一件好事)。一种方法是使用块范围,例如:

{
    int i, j;                          // Scope starts here,
    for (i = 0, j = 0; i < 10; i++)
        if (m_Var == 1)
            j++;
    if (j == 0)                        // still exists here,
        DoSomething();
}                                      // and ends here.

这仍将ij限制在特定的小区域,但允许jif语句中“逃脱”。

答案 4 :(得分:0)

c ++使用该变量的块范围 - msdn docs