C++中的变量作用域

9
如果我有以下代码:
for(int myvar = 0; myvar < 10; myvar++);
if(1)
{
    int var2 = 16;
}

然后,之后我写了以下内容:
myvar = 0;
var2 = 0;

这样做合法吗? 我的 VC++6 可以正确编译它,但我认为这应该是不合法的。(在我的另一个编译器中,它会给出编译器错误。)


4
我的 VC++6 编译它是正确的。——不,它并不正确。 - avakar
@所有回答者,我只有一台电脑上安装了VC++6;在我的另一台电脑上,我安装了VC++2008EE。我被迫使用VC++6. :) - Mateen Ulhaq
5个回答

17

不会,根据(§3.3.2 局部作用域):

  1. 在块中声明的名称(6.3)仅在该块中有效。其潜在作用域始于其声明点(3.3.1),并在其声明区域结束。

我建议您使用最近十年发布的编译器。


11

VC6相当古老,而且在标准的应用上不总是非常严格 :-) 它实际上在某些情况下泄漏了作用域,比如:

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

这导致了一些神奇的宏魔法来解决这个问题。如果您使用符合ISO标准的编译器,那么您尝试做的这两件事都是非法的。

根据 ISO C++11 3.3.3/1,处理引入带有{...}的块范围:

在块中声明的名称局部于该块;它具有块作用域。其潜在作用域始于其声明点,并在其块结束时结束。

6.5.3节涵盖了由for语句“创建”的变量的作用域:

如果for-init-statement是一个声明,则所声明的名称的作用域延伸到for-statement的结尾。


4

那应该是违法的,但 VC6 在这方面很差。

在 Visual Studio 2005 中,引入了一个名为“在 For-loop 范围内强制一致性”的新项目级设置。这解决了问题并提供了向后兼容性。这意味着旧代码库可以通过禁用此设置在较新版本的 Visual Studio 中编译。

然而,在 VS2005 中,微软做对了一件事情,即默认开启此功能,从而更接近标准。


1
这合法吗?我的VC++6可以编译它,但我认为这应该是不合法的。
不,这不应该是合法的。抛弃VC++6,使用一个新的、更好的编译器。

1

VC花了大约十年时间才实现了在循环和条件语句中声明变量的正确作用域。通常情况下,您不能依赖VC6对C++的判断。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接