単一の警告エラーを無効にする


114

Visual Studioでcppファイルの警告行を1つだけ無効にする方法はありますか?

たとえば、例外をキャッチしてそれを処理しないと、エラー4101(参照されないローカル変数)が発生します。その関数だけでこれを無視する方法はありますが、それ以外の場合はコンパイル単位で報告しますか?現時点で#pragma warning (disable : 4101)は、ファイルの先頭に配置していますが、ユニット全体でオフになっていることは明らかです。


19
タイプのみに言及し、例外に名前を付けない場合、警告は出されません。例えばcatch (const std::exception& /* unnamed */) {.... }。それはあなたの質問には答えませんが、あなたの問題を解決するかもしれません。
Sjoerd、2011

回答:


180
#pragma warning( push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop ) 

1
@Cookie:はい、コンパイラを通過するすべてのコードで機能します。
Matteo Italia

より最近の簡潔な回答については、以下のダニエル・サイザーの回答を参照してください。
Dan Nissenbaum 2016年

4
clangこのプラグマをサポートしていないようですが、あなたはと同じ効果を得ることができ#pragma clang diagnostic push#pragma clang diagnostic ignored "-Wunused-variable"#pragma clang diagnostic popClangユーザーマニュアルの「プラグマを介した診断の制御」を
ランピオン

私はこの機能をあまり使用しないので、使用するときは通常、このページを読んで構文を思い出します。更新されない可能性がある非推奨の関数への呼び出しの周りに配置するだけなので、警告がコンパイラーのリストを邪魔しないようにします。
David A.Gray

Visual Studioの場合、コマンドライン引数は/wd4101です。:フラグと数値の間に通常のものはなく、数値のコンマ区切りリストを実行することはできません。他のコンパイラの場合/nowarn:4101代わりになるかもしれません。
ジェシーチザム2017年

89

1行のコードで警告のみを抑制したい場合は、suppress 警告指定子を使用できます

#pragma warning(suppress: 4101)
// here goes your single line of code where the warning occurs

1行のコードの場合、これは次のように書くのと同じように機能します。

#pragma warning(push)
#pragma warning(disable: 4101)
// here goes your code where the warning occurs
#pragma warning(pop)

8
非常に便利!残念ながら、警告を生成するヘッダーを含む1行では機能しません。
Marko Popovic 2016年

2
@MarkoPopovic:suppress指定子は、前処理された単一のコード行で動作します。次の行#pragma warning(suppress: ...)#includeディレクティブ(パラメーターによって参照されるファイルを現在のコンパイル単位に展開する)である場合、効果はそのファイルの最初の行にのみ適用されます。警告はコンパイラーによって生成されるため、これは明らかです。コンパイラは前処理されたコードで動作します。
IInspectable 2016

@IInspectableその場合、後処理されたコード行と呼びます。前処理済みとは、プリプロセッサによってまだ翻訳されていないことを意味します。
void.pointer

2
@voi: -ed 」の末尾は過去分詞を示します。過去に何かが終わったことを表すために使用されます。「前処理」ラインは完全に処理された行です。
IInspectable

29

#pragma push / popはこの種の問題の解決策であることが多いですが、この場合は、参照されていない変数を削除しないのはなぜですか?

try
{
    // ...
}
catch(const your_exception_type &) // type specified but no variable declared
{
    // ...
}

6
これは質問に対する回答ではありません。確かに、これはOPの問題を解決するかもしれませんが、「私のコードの特定の部分に対する特定の警告をオフにするにはどうすればよいですか?」という同様の質問で将来の読者を助けることはありません。
Sjoerd、2011

1
@Sjoerd:3人が他の人が検索する可能性のある「公式の質問」にすでに回答したので、代わりに、行の間を読んで実際の問題を解決しようとしました(コメントの1分後に到着:P)。
Matteo Italia

11
@Sjoerdは将来の読者として、この回答が実際に役立つことを証明しています。
Mołot

2
@Mołot:元作家として、私はそれが助けてくれてうれしいです。=)
Matteo Italia

9

を使用し#pragma warning ( push )、次にを使用し#pragma warning ( disable )てコードを記述し、次に#pragma warning ( pop )説明するように使用します

#pragma warning( push )
#pragma warning( disable : WarningCode)
// code with warning
#pragma warning( pop ) 

8

例:

#pragma warning(suppress:0000)  // (suppress one error in the next line)

このプラグマは、Visual Studio 2005以降のC ++で有効です
。https://msdn.microsoft.com/en-us/library/2c8f766e(v = vs.80).aspx

このプラグマは、Visual Studio 2005からVisual Studio 2015までのC#では無効です。
エラー:「予期した無効化または復元」。
(私は彼らが実装に取り​​掛かることはなかったと思いsuppressます...)https://msdn.microsoft.com/en-us/library/441722ys(v=vs.140 )
.aspx

C#には別の形式が必要です。これは次のようになります(ただし機能しません)。

#pragma warning suppress 0642  // (suppress one error in the next line)

の代わりにsuppress、あなたはしなければdisableなりませんenable

if (condition)
#pragma warning disable 0642
    ;  // Empty statement HERE provokes Warning: "Possible mistaken empty statement" (CS0642)
#pragma warning restore 0642
else

それはとても醜いです、私はそれをスタイルを変えるだけの方が賢明だと思います:

if (condition)
{
    // Do nothing (because blah blah blah).
}
else

5

ここに示すように、ファイル(またはヘッダーファイル)の上に配置する代わりに、問題のコードを#pragma warning (push)#pragma warning (disable)および対応する#pragma warning (pop)でラップします。

を含む他のいくつかのオプションがありますが#pramga warning (once)


5

UNREFERENCED_PARAMETER定義されWinNT.Hたを使用することもできます。定義は次のとおりです。

#define UNREFERENCED_PARAMETER(P)          (P)

そしてそれを次のように使用します:

void OnMessage(WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(wParam);
    UNREFERENCED_PARAMETER(lParam);
}

なぜそれを使用するのか、変数名自体を省略できると主張するかもしれません。変数が実際に使用される場合があります(異なるプロジェクト構成、デバッグ/リリースビルド)。別の構成では、その変数は未使用のままです(したがって警告)。

一部の静的コード分析では、この非無意味なステートメント(wParam;)に対して警告が表示される場合があります。その場合、デバッグビルドDBG_UNREFERENCED_PARAMETERと同じものUNREFERENCED_PARAMETERを使用できP=P、リリースビルドでも使用できます。

#define DBG_UNREFERENCED_PARAMETER(P)      (P) = (P)

1
C ++ 11以降に[[maybe_unused]]属性があることに注意してください
metablaster '10 / 10/19

2

unreferenced local variableヘッダーへの書き込みを無効にする場合

template<class T>
void ignore (const T & ) {}

そして使う

catch(const Except & excpt) {
    ignore(excpt); // No warning
    // ...  
} 

2
警告を抑制するための関数呼び出し?代わりにこれを行わないのはなぜ(void)unusedVar;ですか?
Nawaz、2011

@Nawaz:(void)unusedVar;?C ++標準に準拠していないと思います。
アレクセイマリストフ

2
値が何もない式です。C ++では、それも可能ですstatic_cast<void>(unusedVar)
Nawaz、2011


2
§5.2.9/ 4は、言うAny expression can be explicitly converted to type “cv void.” The expression value is discardedあなたが書くことができますこれによるstatic_cast<void>(unusedVar)と、static_cast<const void>(unusedVar)static_cast<volatile void>(unusedVar)。すべてのフォームが有効です。それがあなたの疑いを明らかにすることを望みます。
Nawaz、2011

2

特定の状況では、しなければならないというパラメータを持っていますが、直接それを使用しないでください。
たとえば、VS2010でそれに遭遇しました。'e 'がdecltypeステートメント内でのみ使用されている場合、コンパイラーは文句を言いますが、名前付きのvaribleが必要ですe

上記の非#pragma提案はすべて、1つのステートメントを追加するだけに要約されます。

bool f(int e)
{ 
   // code not using e
   return true;
   e; // use without doing anything
}

1
現在(MS VS2015コンパイラでは)これによりC4702到達不能コードが発生します
Cee McSharpface

2

@rampionが言及したように、clang gccを使用している場合、警告は番号ではなく名前によるものであり、次のようにする必要があります。

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
// ..your code..
#pragma clang diagnostic pop

この情報はここから来ます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.