如果我有以下代码:
for(int myvar = 0; myvar < 10; myvar++);
if(1)
{
int var2 = 16;
}
然后,我写了以下内容:
myvar = 0;
var2 = 0;
那会合法吗? 我的VC ++ 6正确编译它,但我认为这应该是非法的。 (它在我的其他编译器中给出了编译器错误。)
答案 0 :(得分:17)
不,它不会(§3.3.2本地范围):
- 块(6.3)中声明的名称是该块的本地名称。它的潜力 范围从它的角度开始 声明(3.3.1)并结束于 声明区域结束。
醇>
我建议您使用过去十年发布的编译器。
答案 1 :(得分:10)
VC6相当陈旧,并不总是......严格......在其标准的应用中:-)它实际上在某些情况下泄露了范围:
for (int i = 0; i < 10; i++) { }
// You can still use 'i' here.
这导致一些funky macro magic来解决这个问题。如果您使用的是符合ISO标准的编译器,那么您尝试执行的操作都是非法的。
从ISO C ++ 11 3.3.3/1
开始,使用{...}
处理块范围的引入:
块中声明的名称是该块的本地名称;它有块范围。它的潜在范围从声明点开始,到结束时结束。
第6.5.3
节涵盖for
语句“创建”的变量范围:
如果
for-init-statement
是声明,则声明的名称范围会延伸到for-statement
的末尾。
答案 2 :(得分:4)
这应该是非法的,但VC6非常糟糕。
在Visual Studio 2005中,引入了一个名为“For-loop Scope强制一致性”的新项目级设置。这解决了这个问题并提供了向后兼容性。这意味着较旧的代码库可以通过禁用此设置在较新版本的visual studio中进行编译。
然而,MS在VS2005中做的一件事是默认打开它,因此更接近标准。
答案 3 :(得分:1)
那会合法吗?我的VC ++ 6正确编译它,但我认为这应该是非法的。
不,它不应该是合法的。转储VC ++ 6。使用新的更好的编译器。
答案 4 :(得分:1)