みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C++, strcpy の warning.

VC2005 Express Edition を使ってます。

#include <iostream>
#include <string>
using namespace std;

int main()
{
  char str[10] = "hello";
  strcpy(str, "HELLO");
}

↑ こちらをコンパイルすると

hello.cpp
.\hello.cpp(8) : warning C4996: 'strcpy' was declared deprecated
C:\Program Files\Microsoft Visual Studio 8\VC\include\string.h(73) : see declaration of 'strcpy'

という警告が出るのはどうしてでしょうか?

#include <string.h> も試したのですが同じ警告でした。

投稿日時 - 2006-08-08 09:46:04

QNo.2326595

困ってます

質問者が選んだベストアンサー

補足に質問があったのでお答えします。

> こういった情報はどこから入手できるのでしょうか?
> 情報の海というか、こういうのは探すのが大変ですね。
> オススメのメーリングリストでもあれば教えて頂けると嬉しいです。

今回のことに関しては、日頃からプログラマの方々のblogを読んでいたり
しますので、その方たちの経験談を覚えていたということです。
C++のメーリングリストということなら FreeML の cppllあたりでしょうか?

参考URL:http://www.freeml.com/info/cppll_novice@freeml.com,http://www.freeml.com/info/cppll@freeml.com

投稿日時 - 2006-08-08 15:04:36

お礼

そのうち登録してみようと思います。 ありがとうございました!

投稿日時 - 2006-08-09 05:16:43

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

これは、VC++2005でCRT関数にセキュリティ強化された関数が
追加された為です。
つまり、strcpy関数 -> strcpy_s関数にバージョンアップされたのです。
警告を解消するには、2通りあります。
(1)ソース上のstrcpyをstrcpy_sへ全置換する。
(2)ソースに下記define文を記述する.
 #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

投稿日時 - 2006-08-08 10:09:47

お礼

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
を #include <iostream> の下につけた場合は同じ警告が出ましたが、
先頭につけるとうまく動作しました。

よく見ると出力ウィンドウに
#define _CRT_SECURE_NO_DEPRECATE
と書いてあり、そちらも先頭に付けると警告が消えました。
回答ありがとうございました!

投稿日時 - 2006-08-09 05:15:50

ANo.3

参考になる情報を見つけました。
とりあえず件の警告は _CRT_SECURE_NO_DEPRECATE というシンボルを
定義することで抑止できるようです。

MSDN Chats: Secure Programming Enhancements in Visual C++ 2005
http://msdn.microsoft.com/chats/transcripts/vstudio/vstudio_070104.aspx

CRT のセキュリティ強化
http://msdn2.microsoft.com/ja-jp/library/8ef0s5kh.aspx

CRT 関数のセキュリティが強化されたバージョン (CRT)
http://msdn2.microsoft.com/ja-jp/library/wd3wzwts.aspx

投稿日時 - 2006-08-08 10:04:59

補足

回答ありがとうございます! 前は UNIX で書いてて
strcpy を20個ほど使ってたのでとてもすっきりしました^^
こういった情報はどこから入手できるのでしょうか?
情報の海というか、こういうのは探すのが大変ですね。
オススメのメーリングリストでもあれば教えて頂けると嬉しいです。

投稿日時 - 2006-08-08 10:34:59

ANo.2

strcpyなどはバッファオーバーランをしてしまう可能性があるので、使用を推奨されない(deprecated)ものになりました。
このため、警告がなされます。

何かのシンボルを定義して条件コンパイルすれば警告を抑止できたような
記憶がありますが正確なところは覚えていません。

投稿日時 - 2006-08-08 09:53:44

ANo.1

  char str[10] = "hello";

これが美味しくないかも。
定数になっちゃうんじゃないかな?

投稿日時 - 2006-08-08 09:51:29