天天看點

error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. T

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

  1. 原因是Visual C++ 2005使用了更加安全的run-time library routines。   
  2. 新的Security CRT functions(就是那些帶有“_s”字尾的函數):   
  3. http://msdn2.microsoft.com/en-us/library/wd3wzwts(VS.80).aspx   
  4. 那麼如何搞定這些警告呢:  

以下為轉載

初次使用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。 

注意:這個方法雖然使用了新的函數,但是不能消除警告你還得同時使用方法二。。。

繼續閱讀