C++ C++;int i未在for()中声明
我正在VS2008中转换一个旧的VC6项目,由于某种原因,2008将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
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) { ... }