2012-08-28 48 views
1

我使用Visual Studio 2010中,當我這樣做視覺未申報的標識符?

for(int i = 0, j = 0; i < 10; i++) 
{ 
     if(m_Var == 1) 
      j++; 
} 

if(j == 0)//This line errors undeclared identifier 
    DoSomething(); 

我已經宣佈在for循環j所以爲什麼它示數「未聲明的標識符」?

另一個例子是

for(int i = 0; i < 10; i++) 
{ 
     m_Var1++; 
} 

for(i = 0; i < 200; i++)//This line errors undeclared identifier 
{ 
     m_Var2++; 
} 

代碼錯誤,即使它被宣佈for循環,但是爲什麼呢?有沒有辦法做到這一點,而不必在循環之前聲明i,而是在循環中聲明它,而不是像上面的例子中那樣?

+0

對於第二個例子,無論如何,在兩個循環中定義'i'都是更好的樣式。 –

回答

5

在第一示例中,j只存在於環

for(int i = 0, j = 0; i < 10; i++) 
{ 
     if(m_Var == 1) j++; 
} // i, j exist no longer 

在第二個例子的範圍內,這同樣適用於i。它的範圍是第一個循環。你甚至可以檢查它沒有一個循環:

{ 
    int i = 0; 
} // end of scope, end of i 

i++; // error, 
2

因爲你在循環聲明它因此,一旦循環完成,您j變量超出範圍。當你在for語句中聲明像這樣的變量時

for(int i = 0, j = 0; i < 10; i++) 

變量只有循環範圍。

1

我已經宣佈在for循環j ...

是的,你有。而你只能使用,因爲它的作用域在該循環的結束大括號處結束,因此在for循環中使用。之後你不能使用它。

如果你想在之後使用它,你必須將範圍移出一點點,但不會影響其他東西(本地化仍然是件好事)。一種方法是使用塊範圍,是這樣的:

{ 
    int i, j;       // Scope starts here, 
    for (i = 0, j = 0; i < 10; i++) 
     if (m_Var == 1) 
      j++; 
    if (j == 0)      // still exists here, 
     DoSomething(); 
}          // and ends here. 

這仍然限制ij到一個特定的,面積小,但允許jif聲明「逃離」。

+1

這是'j'的範圍,而不是它的存儲時間,這是相關的。 –

+0

Keith,甚至現在,在經過三十年的C編碼之後,我有時會感到困惑。改爲修復。 – paxdiablo

3

據我所知,C++的一些非常早期版本的變量在for範圍內定義爲包含循環的塊。在現代C++中,範圍僅限於for循環本身。例如:

void foo() { 
    for (int i = 0; i < N; i ++) { 
     // i is visible here 
    } 
    // In very old C++, i is visible here. 
    // In modern C++, i is not visible here. 
} 

Visual Studio實際上有一個選項來啓用舊的行爲;您可以在配置屬性 - > C/C++ - >語言下關閉「強制For循環範圍一致性」。相應的編譯器命令行選項是/Zc:forScope-。但除非您特別需要編譯您無法修復的舊代碼,否則我強烈建議將其保留爲符合現代C++規則的默認設置。如果您正在編寫新代碼,只需遵循現代C++規則。如果你需要一個變量在循環外部可見,那麼在循環之外聲明它。