2010-10-16 49 views
2

我有一個包含兩個for循環的函數,我使用一個名爲count的變量作爲計數器。我已經選擇了循環名稱,因爲第一個循環在第二個循環開始之前完全執行完畢,所以計數器不會互相干擾。 g ++編譯器已經通過了以下警告採取例外:在單個函數中回收變量名稱

error: name lookup of ‘count’ changed for ISO ‘for’ scoping 
note: (if you use ‘-fpermissive’ G++ will accept your code) 

是可變的回收視爲專業軟件開發不好的做法,或者是一個情境的關注,我錯過了這裏還有什麼其他的意義?

回答

4

你在做這個嗎?

for(int count = 0; ...) 
{ 
    ... 
} 

for(count = 0; ...) 
{ 
    ... 
} 

我懷疑gcc想的是,作爲第二count不在範圍。我認爲它只適用於第一個for循環,但gcc有選擇接受糟糕的代碼。如果您製作第二個int count或將第一個移動到外部示波器,gcc應該很開心。

這取決於具體情況,但我通常不重用變量。變量的名稱應該反映它的用途,並且通過函數切換部分可能會造成混淆。聲明你需要什麼,讓編譯器負責優化。

+0

這似乎重現了OP的編譯器輸出。好決定。 – 2010-10-16 22:19:33

+0

這正是我正在做的,你的建議解決了這個問題。非常感謝。 – 2010-10-16 22:22:11

2

Steve McConnell建議不要在Code Complete中的函數中重用局部變量。

他並不是專業軟件開發實踐中的權威性聲音,但他與你將要獲得明確的聲音相近。

這個說法是讓閱讀代碼更加困難。

你在計算什麼?在此之後命名變量。

+0

史蒂夫麥康奈爾的名字是否有藉口?我沒有聽說過他。也許我一直在搖滾:) <<我在添加更多答案之前先寫了這個。仍然想知道爲什麼這個名字在這裏很有用 - 我認爲他的推理在這裏非常有用,儘管如此謝謝。 (我們都是同時編輯更新的。樂趣。) – 2010-10-16 22:13:15

+0

代碼完成是一本我一直想要拿起一段時間的書。所以我的許多問題都被引用來回答,我認爲這是我接近它的時間。感謝您的輸入。 – 2010-10-16 22:15:26

2

這聽起來像你正在定義的變量?即「for(int count = 0; count ++; count < x)」?如果是這樣,那可能有問題,也不清楚。如果要在第二個循環中使用它,請在兩個循環之外定義它。

+0

確實是這個問題。現在編譯的代碼沒有任何錯誤或警告。謝謝。 – 2010-10-16 22:14:20

1

如果你正在使用這樣的循環計數器變量,那麼通常並不重要。

for (int i ...; ... ; ...) { 
    ... 
} 
for (int i ...; ... ; ...) { 
    ... 
} 

但是,如果你打算到陰影另一個變量:

int i ...; 
for (int i ...; ... ; ...) { 
    ... 
} 

這是一個危險的信號。

相關問題