我正在转换VS2008中的旧VC6项目,出于某种原因,如果在int i
中声明for()
,则将for(int i = 0; ... ; i++)
...
for(i = 0; ... ; i++)
if(i = RANDOM_NUMBER)
视为未声明。
在代码中,他们多次执行此操作:
int i
它告诉我int i = 0
未声明错误,因此我必须将{{1}}放在每个方法的顶部。有没有解决的办法?我对C ++不是很熟悉。
答案 0 :(得分:4)
如果您只想继续使用代码而不修复它,您可以向Microsoft的当前编译器提供-Zc:forScope-
开关,以强制编译器遵循几十年前(或左右)规范的规则。
显然,我不能保证他们的编译器会继续无限期地支持它,所以我仍然会考虑将这段代码更高优先级,但是编译器开关会让你避免它现在,并指定一个优先级,而不是要求立即修复它以继续使用代码。
有趣的是:VC ++ 6 中的编译器实际上能够遵循当前规则(但默认情况下没有)。实际上,强制执行正确范围的开关在实践中无法使用,因为编译器中包含的许多(大多数?)标准头文件依赖于使用该开关禁用的非标准行为。
答案 1 :(得分:1)
这是一个烦人的VC6错误。如果您有很多代码并且不想转换/更正,您可以选择使用特殊的编译器选项来保留旧的错误行为。
正如其他答案所指出的,这种行为是非标准的。
答案 2 :(得分:0)
在C ++的旧时代,int
循环中声明的for
将在包含循环的块中定义。随着C ++标准的引入,在循环内声明的变量范围,包括for
- 循环的初始化部分仅限于循环(同样适用于if
,while
和switch
陈述。
有两种方法可以解决这个问题:
如果您需要保留变量的值,请在for
语句之前声明它:
int i = 0;
for (; ...; ++i) { ... }
...
for (; ...; ++i) { ... }
否则,您只需再次声明:
for (int i = 0; ...; ++i) { ... }
...
for (int i = 0; ...; ++i) { ... }
此外,我强烈建议你获得最新的C ++教程!
答案 3 :(得分:-1)
使用块声明的变量将无法在块外部访问。
{
int i = 0;...
} <-- i will not be accessesible outside this }
Simliarly你的循环是一个块,因此int我声明for循环将无法访问。
for(int i=0;..;..)
{
} //i will not be accessible after this.
但是如果你在它之上声明它,它的范围将是不同的,你可以在这个范围内访问它。
int i=0;
for(i=0;..;..) <-- First for
{
}
for (i=0;..;..) <- Second for
{
}
答案 4 :(得分:-2)
ANSI C禁止混合声明和声明,您需要使用C99标准。不幸的是MS VS2008不支持C99,所以你可以尝试其他编译器(例如Intel)或另一个版本的VS(我听说VS2013支持C99标准,但不确定)。