Visual C++ 2005におけるscanf()に対する警告を抑制する方法

以前、「scanf()のワーニング(Visual C++ 2005)」で書いたことなんですが、なんか微妙にヒット数があるみたいなので適当に書き直してみる。
偶には微妙にためになることも書いておかないとね・・・

例えば次のような簡単なコードを書いてみたとします。

/******************************************************************************
 * scanf_example.c
 *****************************************************************************/

#include <stdio.h>

int main( void )
{
	int i;
	
	printf( "整数値を入力してください > " );
	scanf( "%d", &i );
	
	printf( "%dが入力されました\n", i );
	
	return 0;
}

何のことはない、整数値を間違えずに入力さえすれば、入力された値を画面に出力してくれるプログラムです。(俗にいうオウム返し)
まぁ実はこのコードはどうでも良くて(なら書くなよ・・・)、これに限らずscanf()を用いたソースをVC++ 2005またはCLでコンパイルしたら次のような警告が出ることがあります。

scanf_example.c(8) : warning C4996: 'scanf': This function or variable may be unsafe.
Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNI
NGS. See online help for details.
        C:\Program Files\Microsoft Visual Studio 8\VC\include\stdio.h(295) : 'sc
anf' の宣言を確認してください。

これは/W3以上の警告オプションが有効であるときに発生するのですが、要はscanf()が安全な関数ではないのでscanf_s()を出来れば使って欲しいなぁ~と言ってきているわけです。
または、この警告を抑制するために「_CRT_SECURE_NO_WARNINGS」というものを使ってくれと言ってきております。
なので、ここはおとなしく従って、#include <stdio.h>より前に

#define _CRT_SECURE_NO_WARNINGS

を書いてやるか、または scanf() より前に

#define scanf scanf_s

を書いてやります。
すると、次のようにとりあえずscanf()に関する警告は出なくなります。

Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

scanf_example.c
Microsoft (R) Incremental Linker Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:scanf_example.exe
scanf_example.obj

ただし、学校の課題なんかで使うのであればともかく、scanf()みたいにいろいろと危険な関数を使うことは基本的に推奨できませんけどね。
ただ、Visual C++ 2005を使ってC言語の教科書を一から勉強していてscanf()が書かれているコードをそのまま書いたとして、この警告が毎回出てくると非常にウザいと思います。
そういうときはとりあえず上のやつを書いておけば警告抑制ができますので、是非使ってみてください。
なお、コマンドラインで/W3より下のレベルの警告オプションだとそもそもこの警告は発生しません(^^;;
またVisual C++ 2008はそもそも使ったことがないので、この警告が出るとか、またはこの方法で警告が抑制できるのかはまーったく存じませんので、ご了承ください。

「Visual C++ 2005におけるscanf()に対する警告を抑制する方法」への3件のフィードバック

  1. char buff[256];
    fgets(buff, 256, stdin);
    int ret = atoi(buff);
    とすることでscanfの問題は解決できます。

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中