這是對修復舊版本的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