它是为了修复旧版本 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++ 有什么 bug,循环之后都会超出范围。这可确保相同的代码在 Visual C++ 和符合标准的编译器中一致地正确编译,并且不正确的代码不会一致地正确编译。
另请注意,如果宏定义如下:
// DO NOT USE
#define for if(1) for
那么虽然这对于一些简单的代码会有同样的效果,但它会突然导致以下代码编译错误:
if(foo)
for(...)
{
...
}
else
doSomething();
因为如果你展开宏,你会得到这个:
if(foo)
if(1)
for(...)
{
...
}
else
doSomething();
And the else
现在匹配错误if
!所以,巧妙地利用 usingif(0) {} else
代替if(1)
避免了这个问题。
最后一点,#define for if(0) {} else for
不会导致无限递归,因为预处理器不会递归地替换您当前定义的宏。在这种情况下,它只会进行一次替换。