回答:
#pragma warning( push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop )
clang
このプラグマをサポートしていないようですが、あなたはと同じ効果を得ることができ#pragma clang diagnostic push
、#pragma clang diagnostic ignored "-Wunused-variable"
と#pragma clang diagnostic pop
。Clangユーザーマニュアルの「プラグマを介した診断の制御」を
/wd4101
です。:
フラグと数値の間に通常のものはなく、数値のコンマ区切りリストを実行することはできません。他のコンパイラの場合は、/nowarn:4101
代わりになるかもしれません。
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)
suppress
指定子は、前処理された単一のコード行で動作します。次の行#pragma warning(suppress: ...)
が#include
ディレクティブ(パラメーターによって参照されるファイルを現在のコンパイル単位に展開する)である場合、効果はそのファイルの最初の行にのみ適用されます。警告はコンパイラーによって生成されるため、これは明らかです。コンパイラは前処理されたコードで動作します。
#pragma
push / popはこの種の問題の解決策であることが多いですが、この場合は、参照されていない変数を削除しないのはなぜですか?
try
{
// ...
}
catch(const your_exception_type &) // type specified but no variable declared
{
// ...
}
: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
それはとても醜いです、私はそれをスタイルを変えるだけの方が賢明だと思います:
if (condition)
{
// Do nothing (because blah blah blah).
}
else
ここに示すように、ファイル(またはヘッダーファイル)の上に配置する代わりに、問題のコードを#pragma warning (push)
、 #pragma warning (disable)
および対応する#pragma warning (pop)
でラップします。
を含む他のいくつかのオプションがありますが#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)
[[maybe_unused]]
属性があることに注意してください
unreferenced local variable
ヘッダーへの書き込みを無効にする場合
template<class T>
void ignore (const T & ) {}
そして使う
catch(const Except & excpt) {
ignore(excpt); // No warning
// ...
}
(void)unusedVar;
ですか?
(void)unusedVar;?
C ++標準に準拠していないと思います。
static_cast<void>(unusedVar)
。
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)
。すべてのフォームが有効です。それがあなたの疑いを明らかにすることを望みます。
特定の状況では、しなければならないというパラメータを持っていますが、直接それを使用しないでください。
たとえば、VS2010でそれに遭遇しました。'e 'がdecltype
ステートメント内でのみ使用されている場合、コンパイラーは文句を言いますが、名前付きのvaribleが必要ですe
。
上記の非#pragma
提案はすべて、1つのステートメントを追加するだけに要約されます。
bool f(int e)
{
// code not using e
return true;
e; // use without doing anything
}
catch (const std::exception& /* unnamed */) {.... }
。それはあなたの質問には答えませんが、あなたの問題を解決するかもしれません。