Visual C++ のCRT(Cランタイムライブラリ)のビルドエラーについてです。
Microsoft Vidual Studio Express 2013 for Windows DeskTopのコンソールアプリケーションで、以下のようなプログラムを記述した場合、現状ビルドエラーとなります。(スクリーンショットの状態)このエラーを出さないようにする方法についてです。
#include "stdafx.h" #include <string.h> int _tmain(int argc, _TCHAR* argv[]) { char str[10]; strcpy(str,"abc"); return 0; }
エラーメッセージは以下です。
error C4996: ‘strcpy’: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
strcpy関数は、安全ではないので、代わりにstrcpy_s関数を使って下さい。このエラーを出したくない場合は、_CRT_SECURE_NO_WARNINGSを使って下さい。 といった内容です。
詳細はオンラインヘルプを参照して下さいということで、例えば以下にその詳細があります。
CRT のセキュリティ機能
実際にこのMSDNのサイトを見て頂ければいいのですが、C言語の場合はコンパイル(ビルド)時にはエラーにならなくても、実行時に実行エラーが起こる場合があります。よくあるのはメモリ操作の問題で意図しない動作をする場合があります。これを避けるために、_sの関数を使用して下さいとのことです。
(※セキュリティという言葉を使っていますが、プログラム自体が安全に動作するとという意味でのセキュリティと考えればいいかと思います。)
ということでこの指示通りに、_sの関数を使えばいいのですが学校や企業では通常は_sのつかない関数で学習すると思います。そこでやっと本題ですが、とりあえずこのビルドエラーを出さない方法についてです。
これも上記のMSDNのサイトにあるのですが、_CRT_SECURE_NO_WARNINGSを利用します。以下の1行を、stdafx.hに追加します。他にも方法がありますがここではこの方法を使います。
#define _CRT_SECURE_NO_WARNINGS 1
以下がこの行を追加したstdafx.hです。
// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または // 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル // を記述します。 // #pragma once #define _CRT_SECURE_NO_WARNINGS 1 //これが追加した行 #include "targetver.h" #include <stdio.h> #include <tchar.h> // TODO: プログラムに必要な追加ヘッダーをここで参照してください。
この定義で自動的に、_sの関数に変更されるとのことで、とりあえず実行出来ます。注意点ですが、この行を追加する場所によっては有効にならないでやはりビルドエラーになる場合があります。これはプリコンパイルヘッダの関係です。プリコンパイルとは簡単に説明すると、コンパイル(ビルド)の速度を向上させる仕組みです。
但し、いずれにしてもプログラム上に問題がある場合は意図しない動作をしますのでまずは問題の起こらないプログラムを記述する事が大事です。(※学習中の方々はいろいろと動かしてみて問題を解決しながら正しい記述を覚えていって頂ければと思います。)