这是对修复旧版本的Visual C++(v6.0及更早版本)中的错误。在过去,的Visual C++打破了有关内部for
语句声明的变量的作用域规则:
// This compiles in old versions of Visual C++, but it is in fact INVALID C++
for(int i = 0; ...)
{
...
}
for(i = 0; ...)
{
}
换句话说,的Visual C++给i
一个范围,如果它被宣布为外循环,它可以让你继续使用它循环完成后。这导致了代码,如上面的代码片段。在更符合标准的编译器中,i
已不在第二个for
循环的定义范围内,因此编译器发出关于i
未定义的错误。
为了解决这个问题,有些人使用这个宏(或非常相似,相当于宏):
#define for if(0) {} else for
这改变了for
循环到这一点:
if(0)
{
}
else
for(int i = 0; ...)
{
...
}
这使for
环成这是一个额外的范围,所以在for
循环中声明的任何变量都将超出范围,而不管Visual C++的错误。这确保相同的代码在Visual C++和符合标准的编译器中都能够正确编译,并且不正确的代码不能一致地编译。
还要注意,如果宏被改为定义为这样:
// DO NOT USE
#define for if(1) for
然后尽管这对一些简单的代码相同的效果,它会突然导致下面的代码不正确地编译:
if(foo)
for(...)
{
...
}
else
doSomething();
因为如果展开宏,你将会得到:
if(foo)
if(1)
for(...)
{
...
}
else
doSomething();
而else
现在与错误的if
匹配!因此,巧妙使用if(0) {} else
而不是if(1)
可以避免这个问题。
作为最后一点,#define for if(0) {} else for
不会导致无限递归,因为预处理器不会递归地替换您当前定义的宏。在这种情况下它只会做一个替换。
什么是相关性?我不明白。此外,我不会说这是一个错误。这不是范围工作的方式吗? – 2009-06-12 04:30:09
是的,这听起来更真实。问:他们为什么会把if(false){}条件而不是简单的if(1)。 – 2009-06-12 04:31:47