Visual Studioでcppファイルの警告行を1行だけ無効にする方法はありますか?
たとえば、例外をキャッチして処理しないと、エラー4101(参照されていないローカル変数)が発生します。その関数でこれを無視する方法はありますが、それ以外の場合はコンパイル単位で報告しますか?現時点では、#pragma warning (disable : 4101)
をファイルの先頭に配置していますが、それは明らかにユニット全体でオフになっています。
#pragma warning( Push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop )
1行のコードで警告のみを抑制したい場合は、suppress
warning 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)
#pragma
プッシュ/ポップは多くの場合、この種の問題の解決策ですが、この場合、参照されていない変数を削除しないのはなぜですか?
try
{
// ...
}
catch(const your_exception_type &) // type specified but no variable declared
{
// ...
}
#pragma warning ( Push )
を使用してから#pragma warning ( disable )
を使用し、コードを入力してから、説明どおりに#pragma warning ( pop )
を使用します here :
#pragma warning( Push )
#pragma warning( disable : WarningCode)
// code with warning
#pragma warning( pop )
ファイル(またはヘッダーファイル)の上に置くのではなく、示されているように、問題のコードを#pragma warning (Push)
、#pragma warning (disable)
および一致する#pragma warning (pop)
でラップするだけです here 。
#pramga warning (once)
など、他のオプションもありますが。
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)
例:
#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
特定の状況では、mustには名前付きパラメーターがありますが、直接使用しません。
たとえば、VS [2010]で、[e]がdecltype
ステートメント内でのみ使用されている場合、コンパイラーは文句を言いますが、名前付き変数e
が必要です。
上記のすべての#pragma
以外の提案はすべて、1つのステートメントを追加するだけに要約されます。
bool f(int e)
{
// code not using e
return true;
e; // use without doing anything
}
@rampionが言及したように、clang gccを使用している場合、警告は番号ではなく名前であり、あなたがする必要があります:
#pragma clang diagnostic Push
#pragma clang diagnostic ignored "-Wunused-variable"
// ..your code..
#pragma clang diagnostic pop
この情報は here からのものです
unreferenced local variable
を無効にする場合は、ヘッダーに書き込みます
template<class T>
void ignore (const T & ) {}
そして使用
catch(const Except & excpt) {
ignore(excpt); // No warning
// ...
}