プログラミング、リファクタリング、そしてすべてにおける究極の疑問: No. 22

その他インテル® DPC++/C++ コンパイラー特集

この記事は、インテル® デベロッパー・ゾーンに公開されている「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++* でこの警告を抑止する」 (英語) を参照してください。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました