2

所以,我已經看到了一些線程解釋如何避免未引用參數的警告,例如:根據我如何處理未引用的參數,編譯器會做不同的事情嗎?

Avoid warning 'Unreferenced Formal Parameter'
C++ What is the purpose of casting to void?

但我不知道是編譯器是否會基於什麼不同使用哪種方法。例如,以下三種情況的編譯輸出是否會有所不同?

void Method(int /*x*/) 
{ 
    // Parameter is left unnamed 
} 

void Method(int x) 
{ 
    x; // This would be the same as UNREFERENCED_PARAMETER(x); 
} 

void Method(int x) 
{ 
    (void)x; // This would be the same as _CRT_UNUSED(x); 
} 

我是什麼樣的編譯器會做的角度來看最感興趣的,但如果你超過別人一個辦法強烈地感受到,我很高興聽到這些觀點也是如此。

+0

有趣的是,現在我想知道如果選擇1將使優化的對象,如智能指針而正常情況下調用構造函數/析構函數對。這不會生成未引用的參數警告,但我不知道是否註釋掉參數將避免這些調用。此刻離開我的編譯器(AFC),但如果我後來記得我會測試這個。 – FrolickingFerret

回答

0

我看不出爲什麼編譯器會對待這些不同的任何理由。但是唯一確定編譯器的方法是讓你查看編譯器的輸出。

我寧願選擇第一個選項,因爲這種情況(未使用的參數)是該語言功能的設計目的。

+0

謝謝,我絕對可以檢查我使用的編譯器。我在這裏問的原因部分在於看看有沒有人說「不!不要使用選項N!這會在這樣和那樣的編譯器上做壞事。」我一般也喜歡選項1,但我目前傾向於UNREFERENCED_PARAMETER,因爲我使用的是Microsoft VC++編譯器,並且有很多情況下這些參數用於斷言或調試專用代碼。 – FrolickingFerret

+0

我也很喜歡詹姆斯的回答,但這一個更符合我的問題的表現方面。 – FrolickingFerret

2

其中最後一個選項(void)x;在大多數情況下更可取。

第一個選項留下參數未命名是可以接受的,但通常對參數有一個用於調試目的的名稱是有用的(例如,即使您沒有在函數中使用參數,您可能會在調試時對其價值感興趣)。有些情況下,這個選項很好,但是,例如,當做tag dispatching

第二個選項x;可能會導致其他警告。 Visual C++會發出此警告代碼C4555:

warning C4555: expression has no effect; expected expression with side-effect 

通過藉助(void)x;鑄造xvoid,此警告被抑制。 (請注意,此警告默認是關閉的。這個警告​​必須通過#pragma或命令行選項明確允許)

+0

謝謝,最好知道選項2可能會產生其他警告。所以在這方面選項3的+1,儘管這不完全是與性能相關的。 – FrolickingFerret

相關問題