この回答とそれに追加されたコメントは、#pragma
ディレクティブを使用していくつかのコンパイラ警告を無効にする方法を示しています。
なぜそれをしたいのでしょうか?通常、警告は理由があるので、私は常にそれらが正当な理由だと感じています。警告を無効にする「有効なケース」はありますか?今は何も考えられませんが、多分それは私だけです。
この回答とそれに追加されたコメントは、#pragma
ディレクティブを使用していくつかのコンパイラ警告を無効にする方法を示しています。
なぜそれをしたいのでしょうか?通常、警告は理由があるので、私は常にそれらが正当な理由だと感じています。警告を無効にする「有効なケース」はありますか?今は何も考えられませんが、多分それは私だけです。
回答:
警告を無効にする状況は1つしかありません。警告エラーを考慮するので、通常は警告を出してリリースしません。しかし、顧客でAPIを開発しているときに、1つのアプリケーションによる移行フェーズで必要であり、他のアプリケーションが使用すべきでないメソッドをライブラリに含める必要があるという問題に直面しました。
APIのすべてのユーザーに、このメソッドを呼び出してはならないことを伝える最善の方法は、このメソッドを廃止とマークすることでした。ただし、これは、1つの有効なユースケースがコンパイル警告としてマークされたことを意味します。
Eric Lippertは、コンパイラチームが警告についてどのように考えているかについての情報を見つけることができる警告に関するいくつかの投稿を書いています。
以下に、ドキュメントで警告を無効にする理由を説明する警告をいくつか示します。
他の例としては、古いメソッドを使用したい場合や、ローカルで読み取りを行わずにリフレクションを使用するプライベートメンバーを使用したい場合に、減価償却メソッドの使用に関する警告が含まれます。
私の経験では、C#はC ++などの他の言語よりも警告を無効にする必要がありません。これは、主にEric Lippertがブログで述べているように、「コードが壊れている、誤解を招く、または役に立たないことがほぼ確実に言える状況でのみ警告を予約しようとする」ためです。
私は定期的にのバリアントに遭遇するCの例:
int doSomething(int argument1)
{
#ifdef HARDWARE_TYPE_A
performAction(argument1);
#else
displayNotSupportedMessage();
#endif
}
引数は一部のプラットフォームにのみ関係しますが、関係のないプラットフォームではコンパイラーが文句を言い、エラーに変換された警告があるため、ビルドできません。
警告をエラーに変換するには、「これではなく、この場合はコンパイラよりもよく知っている」ためのエスケープハッチが必要です。
ベストプラクティスを目指しているプロジェクトであっても、コンパイラの警告を選択的に無効にする理由はかなりあります。
-isystem
ですが、システムヘッダーの違いが無視できる警告を引き起こす場合があります(おそらく、あるシステムでは関数が別のシステムではなく署名された戻り値を持つ)-Wsign-compare
。-Wsign-conversion
など)。(void)arg1; (void)arg2; (void)arg3; ...
スタブする場合、すべてのスタブ関数の本体を強制することは役に立ちません。この場合は-Wunused-parameter
した方が良いでしょう。:すべてのこれらの例では、その前提と警告を無効にするなど、実際のバグを非表示にするつもりはないことに注意してください-Wredundant-decls
、-Wunused-parameter
、-Wdouble-promotion
多分、-Wpedantic
...あなたは何をやっている知っています!
前回特定の警告を無効にしたのは、インターンが悪いコードを残していたためです。偶然のデータ表現を明確な変換境界に置き換えることで、私はそれをより良く機能させました。
それまでは、それをコンパイルする必要があり、「警告はエラーです」オプションをオンにする必要があったため、一部の警告を抑制しました。
現在、私が今まで無視した唯一の警告は
warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
マイクロソフトはC ++仕様を実装していないため(ドキュメントには記載されていません!)、関数は特定のスローを宣言でき、すべての関数はthrow()またはthrow(...)のいずれか、つまり何もまたはすべてをスローできません。
HelpViewer 1.1から:
A function is declared using exception specification, which Visual C++ accepts but does not implement. Code with exception specifications that are ignored during compilation may need to be recompiled and linked to be reused in future versions supporting exception specifications.