2010-11-02 41 views
9

如果我有下面的代碼:變量的作用域在C++

for(int myvar = 0; myvar < 10; myvar++); 
if(1) 
{ 
    int var2 = 16; 
} 

然後,後來我寫了下面:

myvar = 0; 
var2 = 0; 

請問這合法嗎? 我的VC++ 6編譯正確,但我認爲這應該是非法的。 (它提供了編譯器錯誤在我的其他編譯器之一。)

+4

「我的VC++ 6編譯正確,」不,不。 – avakar 2010-11-02 09:12:28

+0

@all答案,我只在一臺計算機上有VC++ 6;在我的另一方面,我有VC++ 2008EE。我不得不使用VC++ 6。 :) – 2010-11-02 23:17:30

回答

10

VC6是比較舊的,而不是一味... ...剛性在其應用標準的:-)它實際上泄露範圍在某些情況下,如:

for (int i = 0; i < 10; i++) { } 
// You can still use 'i' here. 

這導致了一些funky macro magic來解決這個問題。如果您使用的是符合ISO的編譯器,那麼您嘗試執行的這些操作都是非法的。

從ISO C++ 11 3.3.3/1,處理引入塊範圍的與{...}

在一個塊中聲明的名稱是局部的塊;它有塊範圍。它的潛在範圍從宣佈的角度開始,到結束時結束。

如果for-init-statement是一個聲明,姓名(或名稱)的範圍內聲明延伸到for-statement結束:

6.5.3for聲明佔地面積變量「創造」的範圍。

+1

我想你的意思是C++ 0x。 – 2010-11-03 03:03:45

17

不,它不會(§3.3.2本地範圍內):

  1. 在一個塊中聲明的名稱(6.3)是該塊的本地。其潛在的 範圍從 聲明(3.3.1)開始,並在其聲明區域的末尾 結束。

我推薦你使用過去十年發佈的編譯器。

1

這是合法嗎?我的VC++ 6編譯正確,但我認爲這應該是非法的。

不,它不應該是合法的。轉儲VC++ 6。使用新的更好的編譯器。

1

VC花了大約十年的時間來爲在循環和條件語句中聲明的變量實現適當的範圍。一般來說,你不能依靠VC6對C++的判斷。

4

這應該是非法的,但VC6是非常糟糕的。

在Visual Studio 2005中引入了一個新的項目級設置,名爲「For-loop Scope中的Force Conformance」。這解決了問題並提供了向後兼容性。這意味着,通過禁用此設置,較舊的代碼庫可以在較新版本的Visual Studio中編譯。

但是,MS在VS2005中做了一件事,默認情況下將其打開,因此接近標準。