Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;int i未在for()中声明_C++_Visual C++_Visual Studio 2008_Declaration - Fatal编程技术网

C++ C++;int i未在for()中声明

C++ C++;int i未在for()中声明,c++,visual-c++,visual-studio-2008,declaration,C++,Visual C++,Visual Studio 2008,Declaration,我正在VS2008中转换一个旧的VC6项目,由于某种原因,2008将int I视为未声明,如果它是在for()中声明的 在代码中,他们多次这样做: for(int i = 0; ... ; i++) ... for(i = 0; ... ; i++) if(i = RANDOM_NUMBER) 它给了我inti未声明的错误,因此我必须将inti=0放在每个方法的顶部。有办法解决这个问题吗?我对C++不太熟悉。 ANSI C禁止混合声明和语句,你需要使用C99标准。不幸的是,MS VS2

我正在VS2008中转换一个旧的VC6项目,由于某种原因,2008将
int I
视为未声明,如果它是在
for()
中声明的

在代码中,他们多次这样做:

for(int i = 0; ... ; i++)

...

for(i = 0; ... ; i++)

if(i = RANDOM_NUMBER)

它给了我
inti
未声明的错误,因此我必须将
inti=0
放在每个方法的顶部。有办法解决这个问题吗?我对C++不太熟悉。

ANSI C禁止混合声明和语句,你需要使用C99标准。不幸的是,MS VS2008不支持C99,所以您可以尝试其他编译器(例如Intel)或其他版本的VS(我听说VS2013确实支持C99标准,但不确定)。

使用ING块声明的变量将无法在块外访问

{
    int i = 0;... 
} <-- i will not be accessesible outside this }
但是如果您在它上面声明它,它的范围将不同,您可以在5月份使用该范围访问它

int i=0;
for(i=0;..;..) <-- First for
{
}

for (i=0;..;..) <- Second for
{
}
inti=0;

在C++的旧版本中(i=0;..,…)< P>,在<代码>中声明< <代码> int >代码> ->循环>将在包围循环的块中定义。随着C++标准的引入,在循环内声明的变量范围,包括<<代码> > <代码>循环的初始化部分,被限制为循环(同样的代码用于< <代码> > <代码> > ,和<代码>开关< /代码>语句)。 有两种方法可以解决此问题:

  • 如果需要保留变量的值,可以在
    for
    -语句之前声明:

    int i = 0;
    for (; ...; ++i) { ... }
    ...
    for (; ...; ++i) { ... }
    
  • 否则,您只需再次声明:

    for (int i = 0; ...; ++i) { ... }
    ...
    for (int i = 0; ...; ++i) { ... }
    

  • 也,我<强>强< /强>建议您获得最新的C++教程! 这是一个令人讨厌的VC6错误。如果您有很多代码,并且不愿意转换/更正,那么您可以选择使用特殊的编译器选项来保留旧的代码,从而避免错误的行为


    正如在其他答案中指出的那样,这种行为是不符合标准的。

    如果您只想继续使用代码而不修复它,您可以为Microsoft当前的编译器提供
    -Zc:forScope-
    开关,以强制编译器遵循几十年前(或几十年前)的规范

    显然,我不能保证他们的编译器会无限期地支持它,所以我仍然认为更新这个代码是相当高的优先级,但是编译器开关现在允许你避免它,并且分配优先级,而不是要求它立即被固定以继续使用代码。


    有趣的是:VC++6中的编译器实际上能够遵循当前规则(但默认情况下没有)。然而,执行正确的范围的开关在实践中是不可用的,因为编译器中包含的标准头的许多(大部分)依赖于用该开关禁用的非标准行为。< / P>他的问题是C++,而不是C。你的答案似乎与眼前的问题无关。作者的问题是关于确切的问题,而不是关于语言。问题是VS使用C(而不是C++)编译器来处理上述代码。显然,在使用C++编译器的情况下,问题将消失。抱歉,不。问题是VC++ 6(编译C++)遵循一个甚至在发布(15年前)过时的规则。至少在默认情况下,它们的编译器遵循当前规则(同样,在编译C++时)。尝试将
    用于在C89中,int(i)……/Cube >是不允许的,所以他使用的修复程序将不起作用。C99与条件语句中声明的变量具有相同的C++范围。切换到C99编译器不会使该程序编译,即使它恰巧没有C++特性。很高兴看到Jerry Coffin实际上回答了下面的问题。
    
    for (int i = 0; ...; ++i) { ... }
    ...
    for (int i = 0; ...; ++i) { ... }