2009-09-09 167 views
1

這是在聲明時初始化變量的最佳做法。w8004編譯器警告BDS6 c/C++

int TMyClass::GetValue() 
{ 
    int vStatus = OK; 
    // A function returns a value 
    vStatus = DoSomeThingAndReturnErrorCode(); 
    if(!vStatus) 
     //Do something 
    else 
     return(vStatus); 
} 

在調試模式,這樣int vStatus = OK;一個語句引起調試模式的構建過程中沒有問題。

同樣,當構建以發佈模式,拋出一個警告說:

w8004:「VSTATUS」被分配一個是從未使用過的值。

而且,我在同樣的功能進一步使用相同的變量了我的代碼,這樣if(!vStatus),也是我回報的return(vStatus);

值當我看着網頁的pointers on this debug Vs Release,編譯器期望你在聲明它的時候初始化你的變量。

我正在使用Borland開發人員工作室6與Windows 2003服務器。

任何指針都會幫助我理解這個問題。

感謝

拉吉

+0

推遲變量的定義(不是聲明,BTW)是最好的實踐,直到你有一些東西要初始化爲止。看Glen的回答。這樣你就沒有未初始化的變量,並且你不需要用一些虛擬值來初始化變量,以便稍後重寫它們。 – sbi 2009-09-09 13:42:49

+0

REAL最佳實踐是在具有初始化值的位置聲明值,而不是在更早的位置。你早先宣佈vStatus一行。因此,你假設一行將是「OK」。 – MSalters 2009-09-09 13:43:02

回答

3

您初始化VSTATUS就OK了,然後立即指派一個新值。

而不是這樣做,你應該用你將要使用的值賦值vStatus。

嘗試做,而不是執行以下操作:

int TMyClass::GetValue() 
{ 
    // A function returns a value 
    int vStatus = DoSomeThingAndReturnErrorCode(); 
    if(!vStatus) 
     //Do something 
    else 
     return(vStatus); 
} 

編輯:一些澄清。

初始化一個變量,只是從不使用該值,然後向變量賦值另一個值是效率低下的。在你的情況下,你只是使用int的地方,這不是一個真正的問題。但是,如果在爲類型創建/複製/分配時存在大量開銷,那麼開銷可能會導致性能下降,尤其是如果你做了很多。

基本上,編譯器正試圖幫助你和你的節目裏改進可以在你的代碼

+0

感謝您的評論。但爲什麼這需要警告。我在開始聲明和初始化的原因是,我知道我的狀態變量賦予了什麼值。 – Raj 2009-09-09 13:44:01

+0

Sbi和Msalters在我發佈上述評論時解釋了我的問題的答案。謝謝 – Raj 2009-09-09 13:45:39

+0

警告不是強制性的。相反,它們是編譯器作者認爲很適合引起您注意的事情。一般來說,它們很好,因爲它們會包含諸如「你忘記了函數中的返回語句」或「函數foo()中的變量x隱藏了主函數中的變量x」。 – 2009-09-09 16:57:46

0

如果你想知道爲什麼有一個在調試模式沒有警告做出指出的領域,這是因爲通行證執行數據流分析(這是發現問題的那些)僅作爲優化的一部分運行。