error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
Visual Studio 2012諸如此類的問題
[html] view plain copy
- 原因是Visual C++ 2005使用了更加安全的run-time library routines。
- 新的Security CRT functions(就是那些帶有“_s”字尾的函數):
- http://msdn2.microsoft.com/en-us/library/wd3wzwts(VS.80).aspx
- 那麼如何搞定這些警告呢:
以下為轉載
初次使用VS2010基于C++開發項目碰到的問題及解決方法
1、将過去的工程用VS2010打開的時候。你有可能會遇到一大堆的警告:warning C4996。
比如:warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
原因是Visual C++ 2005使用了更加安全的run-time library routines。
新的Security CRT functions(就是那些帶有“_s”字尾的函數):
http://msdn2.microsoft.com/en-us/library/wd3wzwts(VS.80).aspx
那麼如何搞定這些警告呢:
原因解釋
這種微軟的警告,主要因為那些C庫的函數,很多函數内部是不進行參數檢測的(包括越界類的),微軟擔心使用這些會造成記憶體異常,是以就改寫了同樣功能的函數,改寫了的函數進行了參數的檢測,使用這些新的函數會更安全和便捷。關于這些改寫的函數你不用專門去記憶,因為編譯器對于每個函數在給出警告時,都會告訴你相應的安全函數,檢視警告資訊就可以獲知,在使用時也再檢視一下MSDN詳細了解。庫函數改寫例子:
mkdir改寫為 _mkdir
fopen”改寫為 fopen_s
stricmp改寫為 stricmp_s
sprintf改寫為sprintf_s
strcpy改寫為strcpy_s
解決方案:
1> 根據下面的warning提示:參見“fopen”的聲明
消息:“This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.”
是以可以将函數按warning提示的第二句,改為使用fopen_s函數即可:
例如:FILE *pFile=fopen("1.txt", "w");
改為:
FILE* pFile;
fopen_s(&pFile, "1.txt", "w");
2> 還是根據warning提示的地三句話:use _CRT_SECURE_NO_DEPRECATE
項目|屬性|配置屬性|C/C++|指令行|附加選項,加入【/D "_CRT_SECURE_NO_DEPRECATE" 】(注:加入中括号中完整的内容)
3> 降低警告級别:項目|屬性|配置屬性|C/C++|正常,自己根據情況降低警告級别(此法不推薦)
注意:高度重視警告:使用編譯器的最高警告級别。應該要求建構是幹淨利落的(沒有警告)。了解所有警告。通過 修改代碼而不是降低警告級别來排除警告。
方法一:手工将原來的舊函數替換成新的Security CRT functions。
方法二:屏蔽這個警告。
在預編譯頭檔案stdafx.h裡(注意:一定要在沒有include任何頭檔案之前)定義下面的宏:
#define _CRT_SECURE_NO_DEPRECATE
或者#param warning(disable:4996)
方法二沒有使用新的更安全的CRT函數,顯然不是一個值得推薦的方法,可是你又不想一個一個地改。
那麼還有一個更友善的方法:
在預編譯頭檔案stdafx.h裡(同樣要在沒有include任何頭檔案之前)定義下面的宏:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
在連結的時候便會自動将舊函數替換成Security CRT functions。
注意:這個方法雖然使用了新的函數,但是不能消除警告你還得同時使用方法二。。。