这是为了修复旧版本 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 提供了一个作用域,就好像它是在循环外声明的一样,它允许您在循环完成后继续使用它。这导致代码如上面的sn-p。在更符合标准的编译器中,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 不会导致无限递归,因为预处理器不会递归替换您当前定义的宏。在这种情况下,它只会进行一次替换。