Visual Studio Express 2012 for Windows DesktopのVisual C++でCRT関数の警告を抑制する方法

とりあえずVisual Studio Express 2012 for Windows Desktop関係でもう1個投げておこうかと。
中身は何回目の焼き直しやねん…な感じですが。

※ちなみに以下のエントリーの焼き直し

 
 
Visual Studio 2005あたりから、CRT関数( scanf() とか gets() とか fopen() とか )を使うと、次のような警告が出力されます。

warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
          c:\program files (x86)\microsoft visual studio 11.0\vc\include\stdio.h(290) : 'scanf' の宣言を確認してください。

上の例ではscanf() が安全ではないから安全な関数 scanf_s() を使用するか、_CRT_SECURE_NO_WARNINGS を使って警告を消してねって言われてるんですね。

で、前までのエントリーではとりあえず

#define _CRT_SECURE_NO_WARNINGS

とか、

#define scanf scanf_s

とかを書いて、警告を回避してねって書いてたわけで。
前者は警告を無効にするパターンで、後者は関数を書き換えるパターンですね。

実際のところVS2012でもそれで良いんですが、毎回それで焼きなおすのもアレなので、今回は少しだけ変えてみようかと。

まずは警告を消すパターンですが、#pragmaディレクティブで warning C4996 を無効にする方法か、

#pragma warning( disable:4996 )

前と同じく警告を無効にする定義を入れる方法

#define _CRT_SECURE_NO_WARNINGS

があります。
プログラムの勉強などで警告を消したいだけならこれで良いと思いますが、意味があって警告を出しているので、なるべくこっちは使わないほうが良いのかなという気がします。

というわけで関数を安全なものに書き換える方法ですが、前のやり方だと一々書いていく必要があるわけですが、そんなことしなくて良いわけで、テンプレートオーバーロードなるものがあるんですね。(実はVisual Studio 2005からあったはず。忘れたけど。)

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1

詳しくはリンク先を見ていただくとして、これを書いておくと、CRT関数が呼び出されたときに、セキュアな関数に変換されて呼び出されるんですね。
ちなみに前者で例えば strcpy() とかを strcpy_s() に変換してくれて、後者は前者に加えて指定すると strncpy() なんかのカウント関数を strncpy_s() に変換する機能を有効にしてくれます。

ちなみに、こいつを書いたソースコードを他の環境でも使いたいんだけどなーとか思っちゃったりしたら、次のようにしてやれば良いんじゃなんですかねっと。

#ifdef _MSC_VER
#	define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#	define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1
#endif

#include <stdio.h>

int main( int argc, char *argv[] )
{
	<<処理内容>>;
}

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中