C/C++でObsolete属性っぽいこと
C#(.NET Framework)の[Obsolete]属性を見たとき、「ああ、C/C++にも欲しいなー」と痛切に思いました。APIが変わったり、実装を変更して、こっちを使って欲しい…といった場合、メールの告知や仕様書の改編では絶対に見てもらえない人がいるから。
ところが、似たような物はちゃんとあるんですね。たとえば、Visual C++ 2005でstrcpyを使うとC4996という警告が出ます。
1 2 |
TCHAR Dummy[256]; strcpy(Dummy, TEXT("Dummy")); |
警告 2 warning 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. (以下ソース位置)
これはヘッダファイルで
#pragma deprecated("strcpy")
というプラグマ(実際はstrcpyの実体の関数。マクロ展開しているだけみたい)が定義されているために発生します。私自身は直接CRTの関数をもう10年くらい使っていないので知りませんでした(使うときはlstrcpyを使ってます)。このdeprecatedプラグマ、Visual C++ 2005からかと思ったら、Visual C++ 2003から追加されているんですね。
この警告を出したくない場合は上にあるように、_CRT_SECURE_NO_WARNINGSを定義すればいいようですが…やめましょうね。とはいえ、これが堂々と手順書でまわっていそうな気がする。