C++中的变量范围

Mat*_*haq 9 c++ scope visual-c++-6 visual-c++

如果我有以下代码:

for(int myvar = 0; myvar < 10; myvar++);
if(1)
{
    int var2 = 16;
}
Run Code Online (Sandbox Code Playgroud)

然后,我写了以下内容:

myvar = 0;
var2 = 0;
Run Code Online (Sandbox Code Playgroud)

这合法吗?我的VC++ 6正确编译它,但我认为这应该是非法的.(它在我的其他编译器中给出了编译器错误.)

Mat*_*hen 17

不,它不会(§3.3.2本地范围):

  1. 块(6.3)中声明的名称是该块的本地名称.它的潜在范围从声明点(3.3.1)开始,到声明区域结束时结束.

我建议你使用过去十年发布的编译器.


pax*_*blo 10

VC6相当陈旧,并不总是......严格......在标准的应用中:-)它实际上在某些情况下泄露了范围,例如:

for (int i = 0; i < 10; i++) { }
// You can still use 'i' here.
Run Code Online (Sandbox Code Playgroud)

这导致了一些时髦的宏观魔法来解决这个问题.如果您使用的是符合ISO标准的编译器,那么您尝试执行的操作都是非法的.

从ISO C++ 11开始3.3.3/1,处理块作用域的引入{...}:

块中声明的名称是该块的本地名称; 它有块范围.它的潜在范围从其声明点开始,并在其块结束时结束.

该部分6.5.3涵盖了for声明"创建"的变量范围:

如果for-init-statement是声明,则声明的名称范围延伸到结尾for-statement.