この記事は、インテル® デベロッパー・ゾーンに公開されている「The Ultimate Question of Programming, Refactoring, and Everything」の日本語参考訳です。
22. #pragma warning(default:X) を使用しない
TortoiseGIT プロジェクトから抜粋した以下のコードについて考えてみます。このエラーは、次の PVS-Studio 診断によって検出されます。
V665 Possibly, the usage of ‘#pragma warning(default: X)’ is incorrect in this context. The ‘#pragma warning(push/pop)’ should be used instead. (V665 このコンテキストの ‘#pragma warning(default: X)’ の使用法が正しくない可能性があります。代わりに、’#pragma warning(push/pop)’ を使用すべきです。)
#pragma warning(disable:4996) LONG result = regKey.QueryValue(buf, _T(""), &buf_size); #pragma warning(default:4996)
説明
多くのプログラマーは、”pragma warning(disable: X)” ディレクティブで無効にした警告は、”pragma warning(default : X)” ディレクティブを使用した後に有効になると仮定しますが、それは間違いです。’pragma warning(default : X)’ ディレクティブは、’X’ 警告をデフォルトの状態に設定します。これは、有効にするのとは異なります。
/Wall オプションを使用してファイルをコンパイルする場合、C4061 警告は生成されなければなりません。”#pragma warning(default : 4061)” ディレクティブを追加しても、この警告はデフォルトで無効になるため表示されません。
正しいコード
#pragma warning(push) #pragma warning(disable:4996) LONG result = regKey.QueryValue(buf, _T(""), &buf_size); #pragma warning(pop)
推奨事項
警告の以前の状態を返す適切な方法は、”#pragma warning(push[ ,n ])” ディレクティブと “#pragma warning(pop)” ディレクティブを使用します。これらのディレクティブの説明は、Visual C++* ドキュメントの「Pragma Directives. Warnings」を参照してください。
ライブラリー開発者は、特に V665 警告に注意すべきです。不注意な警告のカスタマイズは、ライブラリー・ユーザー側で非常に多くの問題を引き起こす可能性があります。
このトピックについては、「Visual C++* でこの警告を抑止する」 (英語) を参照してください。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。