2010-11-01 27 views
6

我使用克++ 4.3.0編譯此示例:如果我編譯最大警告電平的例子變量不被檢測爲不使用

#include <vector> 

int main() 
{ 
    std::vector<int> a; 
    int b; 
} 

,我得到的警告變量b是不使用:

[[email protected] data_create]$ g++ m.cpp -Wall -Wextra -ansi -pedantic 
m.cpp: In function ‘int main()’: 
m.cpp:7: warning: unused variable ‘b’ 
[[email protected] data_create]$ 

的問題是:爲什麼不使用的變量一個不報? 哪些參數我必須通過獲得該變量一個的警告?

+0

一些GCC代碼分析警告纔有效(或更好地工作)如果使用優化過,嘗試用-O2或-O3 – 2010-11-02 07:15:48

+0

@Laurynas Biveinis我認爲答案是正確的。在這種情況下,優化級別不起作用(確定我嘗試過)。 – 2010-11-02 07:24:30

回答

23

理論上,std::vector<int>的默認構造函數可能有任意的副作用,因此編譯器無法確定刪除a的定義是否會改變程序的語義。您只會收到內建類型的警告。

一個更好的例子是鎖定:

{ 
    lock a; 
    // ... 
    // do critical stuff 
    // a is never used here 
    // ... 
    // lock is automatically released by a's destructor (RAII) 
} 

即使a其定義後從未使用過,除去第一行是錯誤的。

+0

優秀的答案/例子。前一段時間,當向客戶解釋相同的概念時,我使用了一個類似的例子。客戶打了我的牙齒和釘子,認爲「鎖定」將被優化掉,因爲它「未被使用」。我解釋說,它被保證不會被消除(構造/析構 - 互斥量獲取/釋放的副作用)。我記得,我終於必須找到支持我的觀點的標準和章節。將嘗試找到並回發。 – Dan 2010-11-03 15:21:08

1

一個不是內置類型。你實際上調用了std::vector<int>的構造函數並將結果賦給一個。編譯器將此視爲用法,因爲構造函數可能有副作用。它被聲明爲後其析構函數被調用,在其範圍結束