2013-04-09 63 views
0

最近我有一個非初始化變量很多麻煩。C++:如何確保所有變量都被初始化?

在Java中,變量的默認值是空值,因此一個例外可能是,如果使用非初始化的變量時,被拋出。如果我明白,在C++中,變量是初始化的,並且內存中的任何數據都將被初始化。這意味着程序很可能運行,甚至很難甚至知道它有什麼問題。

乾淨的方式來處理這個問題?是否有一些良好的編程習慣可以降低風險?在我的情況下,變量是在頭文件中聲明的,應該已經在cpp文件中初始化了,這是一個讓錯誤更可能發生的例子。

接受幾個答案後THX


版:

我的道歉,我的問題不夠具體。

我獲得使用標誌的編譯器的答案得到通知未初始化的變量將是有益的。

但也有罕見的套管變量不能在一開始,因爲這取決於你的系統的行爲進行初始化。

在頭文件

double learnedValue; 

在CPP文件

/* code that has nothing to do with learnedValue 
... 
*/ 

learnedValue = a*b*c; // values of a, b and c computed in the code above 

/*code making use of learned value 
... 
*/ 

現在所發生的事情是,忘了線 「learnedValue = A * B * C」。

但程序工作不錯,只是與任何初始化learnedValue的價值是什麼在存儲它在聲明的時候。

在Java中,這樣的錯誤是不是一個問題,因爲代碼利用學習值很可能崩潰或拋出一個異常(至少你知道什麼是錯的)。

在C++中,可以明顯地感到高興和永遠不會知道有一個問題都沒有。要麼 ?

+1

養成了在定義時初始化變量的習慣。 – 2013-04-09 06:21:16

+0

在C++中,一個變量被初始化爲你決定用它進行初始化的任何東西。如果你讓他們不確定,你擲骰子,並採取你的機會(即作爲一個評估時,indeterminate =未定義的行爲)。 – WhozCraig 2013-04-09 06:21:17

+0

只需將變量定義爲您想要的任何值即可。例如,如果你聲明瞭一個'int',將它設置爲'0'。 – OGH 2013-04-09 06:21:52

回答

4

請確保您有在編譯程序時設置適當的警告級別當場定義變量。 每當使用未初始化的變量時,編譯器都會發出適當的警告。

在g ++上,-Wall編譯器選項將顯示所有警告。

在Visual Studio中,你可能必須使用警告級別4

另外,還有一些在市場上的一些靜態代碼分析工具。 cppCheck就是這樣一個免費的工具。

0

你可以在他們的聲明

+0

不適用於靜態或常量成員變量。其他成員變量應該在構造函數中初始化。 – scones 2013-04-09 06:21:29

+0

@scones所以你如何定義一個const變量? – juanchopanza 2013-04-09 06:25:02

+0

一個const成員變量(我在說什麼)是在構造函數中定義的。在.cpp文件中定義了一個靜態的const成員變量(除了static const int)。所有其他const變量應該在現場進行初始化。 – scones 2013-04-09 06:27:54

0

C++ 11允許您在類中初始化變量。如果這還沒有被編譯器實現,那麼構造函數初始化列表就是要檢查的區域。

3

你不應該在頭文件中定義一個變量(只聲明它)。否則,當您將標題包含在多個.cpp文件中時,您會收到其他錯誤。

實際定義一個變量時,也可以給它一個初始值(如0)。在C++中,推遲(局部)變量的定義也是常見的,直到你有一個值賦給它們。

在頭文件

extern double learnedValue; 
^^^^^^ 

在cpp文件

double learnedValue = 0; 

/* code that has nothing to do with learnedValue 
... 
*/ 

learnedValue = a*b*c; // values of a, b and c computed in the code above 

/*code making use of learned value 
... 
*/ 
-1

的C#可以初始化變量。但是C++沒有,所以當使用一個沒有初始化的指針時,它總是拋出異常。您應該習慣於初始化類構造函數中的所有變量。

+0

在C++中解引用未初始化的指針是*未定義行爲*。這當然不能保證拋出異常。 – IInspectable 2013-12-26 00:11:43