题
如果我有以下代码:
for(int myvar = 0; myvar < 10; myvar++);
if(1)
{
int var2 = 16;
}
然后,之后我写了以下内容:
myvar = 0;
var2 = 0;
那是合法的吗?我的VC ++ 6正确编译了它,但我认为这应该是非法的。 (它在我的其他编译器之一中给出了编译器错误。)
解决方案
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
.
其他提示
不,它不会(第3.3.2节本地范围):
- 该块的本地块(6.3)中声明的名称。它的潜在范围始于其声明(3.3.1),并在其声明区域结束时结束。
我建议您使用过去十年中发布的编译器。
那应该是非法的,但是VC6非常糟糕。
在Visual Studio 2005中,引入了一个新的项目级设置名称 “横向范围中的力一致性”. 。这解决了问题,并提供了向后兼容性。这意味着较旧的代码库可以通过禁用此设置在较新版本的Visual Studio中编译。
但是,MS在VS2005中做的一件事是默认情况下打开此操作的一件事,因此更接近标准。
那是合法的吗?我的VC ++ 6正确编译了它,但我认为这应该是非法的。
不,这不应该合法。转储VC ++ 6。使用新的更好的编译器。
VC花了大约十年的时间来实现循环和有条件陈述中声明的变量的适当范围。通常,您不能依靠VC6对C ++的判断。
不隶属于 StackOverflow