2012-06-18 64 views
6

可能重複:
What does 「(void) new」 mean in C++?聲明「(void)startGuardBegin;」做什麼?

我不熟悉C++和我的方法簽名後立即不懂行:

int EAN13Reader::decodeMiddle(Ref<BitArray> row, 
     int startGuardBegin, 
     int startGuardEnd, 
     std::string& resultString) 
{ 
    (void)startGuardBegin; 
    ... 
} 

什麼(void)startGuardBegin; ?一個方法invokation?

+0

@ThiefMaster不是重複的,略有不同的使用'void':丟棄值與標記變量爲未使用。 –

+1

不重複。 –

回答

4

它告訴編譯器該參數未被使用,因此它不應該顯示「未使用的參數」警告。

儘管GCC等編譯器通常以其他方式(int startGuardBegin __attribute__ ((unused)))來指示此操作,通常以某種方式在函數標題中將其轉換爲(void)並不依賴於任何編譯器特定的功能。

3

它什麼也沒做。

相反,它向讀者和任何靜態分析工具指定startGuardBegin未在函數中使用,並且這是確定的和預期的。

靜態分析工具會警告函數中未使用參數,因爲這表示可能存在錯誤。如果無法從簽名中刪除該參數(如果它在調試代碼中使用,或者對於兼容性或未來行爲而言是必需的),那麼在無效語句中使用該參數將會阻止該警告。但是,僅僅在一個語句startGuardBegin;中使用它會觸發另一個警告(因爲該值被丟棄),因此將其轉換爲void可以防止這種情況發生。

+0

實際上,在大多數情況下,它是編譯器,而不是其他一些靜態分析工具。 – ThiefMaster

1

鑄造到void用於抑制未使用的變量和未保存的返回值或表達式的編譯器警告。

標準(2003)說,在§5.2.9/ 4說,

任何表達式可以顯式轉換爲類型「CV空隙。」表達值是丟棄

所以,你可以寫(在C++風格的方式):

//suppressing unused variable warnings 
static_cast<void>(unusedVar); 

//suppressing return value warnings 
static_cast<void>(fn()); 

//suppressing unsaved expressions 
static_cast<void>(a + b * 10); 
static_cast<void>(x &&y || z);  
static_cast<void>(m | n + fn()); 

所有形式都有效。我通常把它縮短爲:

//suppressing expressions 
(void)(unusedVar); 
(void)(fn()); 
(void)(x &&y || z); 

它也沒關係。

相關問題