Google
 
Web itpro-blogger.blogspot.com
水曜日, 5月 02, 2007

[C言語orC++]VC++2005へのバージョンアップ

▼質問
C言語で書かれたソースをVC++2005でリビルドすると下記のエラーが出る。
「警告 1 warning C4996: 'strcpy' が古い形式として宣言されました。 ファイルパス 行番号」

▼回答
VC++2005のランタイムから既存標準関数のセキュリティが持つ脆弱性の対応で
新しい関数が提供されたため。

回避策として次のコードを記述すると無効にできる。
#pragma warning(disable : 4996)

他の回避方法として次の#defineのどちらかを定義すればと書いてあったので
試してみたが警告は消えなかった。なぜ?

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#define _CRT_SECURE_NO_DEPRECATE 1

理由はわからないがヘッダファイルの「stdafx.h」に記述したら消えたぞ!
記述の場所は、ヘッダーファイルが記述している前にしないといけないみたい。

「_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES」の定義は消えない
警告もあるので「_CRT_SECURE_NO_DEPRECATE」を使った方が良いみたい。(^^)v

プロジェクトのプロパティでも定義できるようなのでそちらも試してみました。

「構成プロパティ」->「C/C++」->「プリプロセッサ」->「プリプロセッサの定義」の
末尾に 追加する。

この他にも下記の関数も変更になったようだ。

従来の関数:セキュアな関数
strcpy:strcpy_s
strncpy:strncpy_s
printf:printf_s
asctime:asctime_s
ctime:ctime_s

■参考サイト
Visual C++ 2005 C/C++ランタイム ライブラリ新機能概要
http://www.microsoft.com/japan/msdn/security/demo/runtime.aspx
CRT のセキュリティ強化
http://msdn2.microsoft.com/ja-jp/library/8ef0s5kh(VS.80).aspx


;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T

▼質問
ライブラリのリンクってどうやってやるの?

▼回答
こんな方法があるよ。

プロジェクトのプロパティでライブラリのファイルを絶対パス(フルパス)で直接設定する方法と
ライブラリファイルとパスを分けて設定する方法があるよ。

前者
「構成プロパティ」->「リンカ」->「入力」->「追加の依存ファイル」に「絶対パス(フルパス)」
を指定する。

後者
「構成プロパティ」->「リンカ」->「入力」->「追加の依存ファイル」にリンクするライブラリ
ファイルを指定して、そのライブラリまでのパスを下記のプロパティに設定する。
「構成プロパティ」->「リンカ」->「全般」->「追加のライブラリ ディレクトリ」






Comments: コメントを投稿

<< Home

This page is powered by Blogger. Isn't yours?