他人の書いたコードの警告を出力しない

VisualC++2005を使っているとコンパイル時に標準ライブラリ、boost library, PhysXSDK等のヘッダファイルから大量の警告が発生します。少しでもバグを無くす為に常に警告レベルを最大にしてコンパイルするようにしているのですが、他人の書いた、あまり自分で書き換えるのはよくなさそうなファイルから大量に警告が出ると自分のコードの警告を探すのが面倒になります。

そこで、警告を出力しないように以下のように#pragma warning(disable: xxxx)を使います。


//たぶんVisual C++でしか効果はありません。
#ifdef _MSC_VER

#pragma warning(push)
//移植性の為、C標準ライブラリを使う。
#define _CRT_SECURE_NO_DEPRECATE
#pragma warning(disable: 4127) //warning about constant condition
#pragma warning(disable: 4819) //warning about encoding of charactor in source code.
#pragma warning(disable: 4512) //warning about impossible to generate operator=
#pragma warning(disable: 4100) //warning about argument is not referenced.
#pragma warning(disable: 4305) //warning about narrowing value from double to float.
#pragma warning(disable: 4996) //warning about deprecated standard C function.
#endif

//ここで他人の書いたヘッダファイルをインクルード

#ifdef _MSC_VER
#pragma warning(pop)
#endif

//ここで自分の書いたヘッダファイルをインクルード
//もちろん警告レベル最大で警告が出力される。

上記の方法だと全ての警告を無効にしているわけではないのですが、自分のインクルードしているファイルでは警告が全滅しました。


上記の方法は少し長いので、ソースコードのあちこちにコピペせずにマクロにしようとしたのですが・・・


#define SUPPRESS_WARNINGS \
#if _MSC_VER \
...

マクロの中にプリプロセッサの命令を含めることは(少なくともVisualC++では)できません。今までプリプロセッサの命令をマクロに含めたりすることがなかったせいか、初めてこのことを知りました。
##ifと書いたり、\#とか書いてみたのですがエラーとなりました。移植性のことを考えるとマクロの中に無理矢理プリプロセッサの命令を含めようとするのはまずいような気がします。そこでプリプロセッサの命令の塊をインクルードファイルにまとめ、使いたいときはファイルをインクルードして使うことにしました。

本体
begin_suppress_warnings_from_others_code.hpp:


#ifdef _MSC_VER

#pragma warning(push)
#define _CRT_SECURE_NO_DEPRECATE
#pragma warning(disable: 4127) //warning about constant condition
#pragma warning(disable: 4819) //warning about encoding of charactor in source code.
#pragma warning(disable: 4512) //warning about impossible to generate operator=
#pragma warning(disable: 4100) //warning about argument is not referenced.
#pragma warning(disable: 4305) //warning about narrowing value from double to float.
#pragma warning(disable: 4996) //warning about deprecated standard C function.
#endif

end_suppress_warnings.hpp


#ifdef _MSC_VER
#pragma warning(pop)
#endif

使うとき


#include

//ここで他人の書いたヘッダファイルをインクルード

#include

//ここで自分の書いたヘッダファイルをインクルード
//もちろん警告レベル最大で警告が出力される。

自分の書いたコードの警告を消すためにプリプロセッサ命令が使われることがないよう、少し長めのファイル名にしてみました。