web-dev-qa-db-ja.com

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

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

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

94
Cookie
#pragma warning( Push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop ) 
158
Andreas Brinck

1行のコードで警告のみを抑制したい場合は、suppresswarning specifier を使用できます。

#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)
72
Daniel Seither

#pragmaプッシュ/ポップは多くの場合、この種の問題の解決策ですが、この場合、参照されていない変数を削除しないのはなぜですか?

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

#pragma warning ( Push )を使用してから#pragma warning ( disable )を使用し、コードを入力してから、説明どおりに#pragma warning ( pop )を使用します here

#pragma warning( Push )
#pragma warning( disable : WarningCode)
// code with warning
#pragma warning( pop ) 
9
sharptooth

ファイル(またはヘッダーファイル)の上に置くのではなく、示されているように、問題のコードを#pragma warning (Push)#pragma warning (disable)および一致する#pragma warning (pop)でラップするだけです here

#pramga warning (once)など、他のオプションもありますが。

4
Christian.K

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)
4
Ajay

例:

#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

それはSOいです。スタイルを変更する方が賢いと思います。

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

特定の状況では、mustには名前付きパラメーターがありますが、直接使用しません。
たとえば、VS [2010]で、[e]がdecltypeステートメント内でのみ使用されている場合、コンパイラーは文句を言いますが、名前付き変数eが必要です。

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

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

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

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

この情報は here からのものです

2
orion elenzil

unreferenced local variableを無効にする場合は、ヘッダーに書き込みます

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

そして使用

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