在 C++ 標(biāo)準(zhǔn)制定之前,在 for 循環(huán)中聲明的變量在循環(huán)外也可以訪問(wèn)。例如:
for (int n=0; n〈MAX; ++n)
{
//..do something
}
++n; //OK in pre-standard C++; illegal in ISO C++
然而,在 ISO C++ 中,for 循環(huán)變量的作用域被限制為循環(huán)本身。雖然這一改變不可否認(rèn)地具有其意義,但是它卻影響到了老代碼以及新代碼。下面我將示范一些遷移技術(shù)幫助你處理這一改動(dòng)。
遺留代碼
對(duì)于那些使用標(biāo)準(zhǔn)制定之前的作用域規(guī)則的遺留代碼,如果使用與標(biāo)準(zhǔn)兼容的編譯器編譯它們,那么就有可能出現(xiàn)錯(cuò)誤。解決這一問(wèn)題的方法是修改代碼。但是,代碼修正需要徹底測(cè)試,而且有時(shí)候還會(huì)招致一連串的缺陷和編譯錯(cuò)誤。
如果不想處理這一難于解決的問(wèn)題,同時(shí)又希望升級(jí)編譯器,那么不妨檢查一下能否有辦法恢復(fù)標(biāo)準(zhǔn)制定之前 for 循環(huán)變量的行為。如果確實(shí)使用了這種變量,那么打開這個(gè)選項(xiàng),然后(使用注釋)明確地在代碼記下這一事實(shí),以使將來(lái)的程序員知道如何正確地編譯這一代碼。
If you’re wary of relying on compilers’ favors, there’s an alternative patch: move the variable’s definition outside the for-loop:
如果不愿依賴編譯器的幫助,那么還有一種替代方案:將變量的定義移至 for 循環(huán)之外:
int n=0; //originally was inside the for loop
for (/*n was here*/; n〈MAX; ++n)
{
//..do something
}
int x=n; //OK
要確保在有改動(dòng)的地方添加一句描述性注釋。
作用域規(guī)則可能也會(huì)影響新代碼。比如說(shuō),假設(shè)我們需要使用一個(gè)依然保持標(biāo)準(zhǔn)制定之前行為的編譯器來(lái)編譯新代碼。
為了確保 for 循環(huán)變量不在循環(huán)之外被訪問(wèn),我們可以將整個(gè)循環(huán)之外包圍一對(duì)大括號(hào)。
{//restrict for-loop variables’ scope
for (int n=0; n〈MAX; ++n)
{
//..do something
}
}//restrict for-loop variables’ scope
With the help of conditional compilation, you can use a macro that inserts braces only when they are needed:
在條件編譯的幫助下,我們可以使用一個(gè)宏來(lái)控制只在需要的地方插入大括號(hào):
#if defined(OLD_FOR_SCOPING)
#define OPEN_FOR_GUARD {
#define CLOSE_FOR_GUARD }
#else
#define OPEN_FOR_GUARD
#define CLOSE_FOR_GUARD
#endif
OPEN_FOR_GUARD
for (int n=0; n〈MAX; ++n)
{
//..do something
}
CLOSE_FOR_GUARD
如果你正在使用新代碼以及與標(biāo)準(zhǔn)兼容的編譯器,那么新作用域規(guī)則將不會(huì)帶來(lái)任何問(wèn)題。然而,當(dāng)涉及到遺留代碼或老編譯器時(shí),你可以應(yīng)用我在這個(gè)小技巧中描述的技術(shù)繞開這一問(wèn)題
for (int n=0; n〈MAX; ++n)
{
//..do something
}
++n; //OK in pre-standard C++; illegal in ISO C++
然而,在 ISO C++ 中,for 循環(huán)變量的作用域被限制為循環(huán)本身。雖然這一改變不可否認(rèn)地具有其意義,但是它卻影響到了老代碼以及新代碼。下面我將示范一些遷移技術(shù)幫助你處理這一改動(dòng)。
遺留代碼
對(duì)于那些使用標(biāo)準(zhǔn)制定之前的作用域規(guī)則的遺留代碼,如果使用與標(biāo)準(zhǔn)兼容的編譯器編譯它們,那么就有可能出現(xiàn)錯(cuò)誤。解決這一問(wèn)題的方法是修改代碼。但是,代碼修正需要徹底測(cè)試,而且有時(shí)候還會(huì)招致一連串的缺陷和編譯錯(cuò)誤。
如果不想處理這一難于解決的問(wèn)題,同時(shí)又希望升級(jí)編譯器,那么不妨檢查一下能否有辦法恢復(fù)標(biāo)準(zhǔn)制定之前 for 循環(huán)變量的行為。如果確實(shí)使用了這種變量,那么打開這個(gè)選項(xiàng),然后(使用注釋)明確地在代碼記下這一事實(shí),以使將來(lái)的程序員知道如何正確地編譯這一代碼。
If you’re wary of relying on compilers’ favors, there’s an alternative patch: move the variable’s definition outside the for-loop:
如果不愿依賴編譯器的幫助,那么還有一種替代方案:將變量的定義移至 for 循環(huán)之外:
int n=0; //originally was inside the for loop
for (/*n was here*/; n〈MAX; ++n)
{
//..do something
}
int x=n; //OK
要確保在有改動(dòng)的地方添加一句描述性注釋。
作用域規(guī)則可能也會(huì)影響新代碼。比如說(shuō),假設(shè)我們需要使用一個(gè)依然保持標(biāo)準(zhǔn)制定之前行為的編譯器來(lái)編譯新代碼。
為了確保 for 循環(huán)變量不在循環(huán)之外被訪問(wèn),我們可以將整個(gè)循環(huán)之外包圍一對(duì)大括號(hào)。
{//restrict for-loop variables’ scope
for (int n=0; n〈MAX; ++n)
{
//..do something
}
}//restrict for-loop variables’ scope
With the help of conditional compilation, you can use a macro that inserts braces only when they are needed:
在條件編譯的幫助下,我們可以使用一個(gè)宏來(lái)控制只在需要的地方插入大括號(hào):
#if defined(OLD_FOR_SCOPING)
#define OPEN_FOR_GUARD {
#define CLOSE_FOR_GUARD }
#else
#define OPEN_FOR_GUARD
#define CLOSE_FOR_GUARD
#endif
OPEN_FOR_GUARD
for (int n=0; n〈MAX; ++n)
{
//..do something
}
CLOSE_FOR_GUARD
如果你正在使用新代碼以及與標(biāo)準(zhǔn)兼容的編譯器,那么新作用域規(guī)則將不會(huì)帶來(lái)任何問(wèn)題。然而,當(dāng)涉及到遺留代碼或老編譯器時(shí),你可以應(yīng)用我在這個(gè)小技巧中描述的技術(shù)繞開這一問(wèn)題