error c4996: 'fopen' This function or variable may be unsafe如何解决
1.問題描述
??? VS2013+OPENCV249,不止一次遇到以下類似錯(cuò)誤:
? ? ? error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.d:\opencv\opencv\build\include\opencv2\flann\logger.h661rodrigues
2.原因
? ?Visual C++ 2012 使用了更加安全的 run-time library routines 。新的Security CRT functions(就是那些帶有“_s”后綴的函數(shù))
? ?這種微軟的警告,主要因?yàn)槟切〤庫的函數(shù),很多函數(shù)內(nèi)部是不進(jìn)行參數(shù)檢測(cè)的(包括越界類的),微軟擔(dān)心使用這些會(huì)造成內(nèi)存異常,所以就改寫了同樣功能的函數(shù),改寫了的函數(shù)進(jìn)行了參數(shù)的檢測(cè),使用這些新的函數(shù)會(huì)更安全和便捷。關(guān)于這些改寫的函數(shù)你不用專門去記憶,因?yàn)榫幾g器對(duì)于每個(gè)函數(shù)在給出警告時(shí),都會(huì)告訴你相應(yīng)的安全函數(shù),查看警告信息就可以獲知,在使用時(shí)也再查看一下MSDN詳細(xì)了解。
3.解決方案
? ?方法一:將原來的舊函數(shù)替換成新的 Security CRT functions。
? ?方法二:用以下方法屏蔽這個(gè)警告:
??? 1. 在預(yù)編譯頭文件stdafx.h里(注意:一定要在沒有include任何頭文件之前)定義下面的宏:
???????#define _CRT_SECURE_NO_DEPRECATE
??? 2. 或聲明?#param warning(disable:4996)
??? 3. 更改預(yù)處理定義:
??????? 項(xiàng)目->屬性->配置屬性->C/C++ -> 預(yù)處理器 -> 預(yù)處理器定義,增加:
????????????_CRT_SECURE_NO_DEPRECATE
? ? 方法三:方法二沒有使用更加安全的 CRT 函數(shù),顯然不是一個(gè)值得推薦的好方法,但我們又不想一個(gè)一個(gè)地改函數(shù)名,這里還有一個(gè)更簡便的方法:
? ?在預(yù)編譯頭文件 stdafx.h 里(同樣要在沒有include任何頭文件之前)定義下面的宏:
? ?#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
? ?在鏈接的時(shí)候便會(huì)自動(dòng)將舊函數(shù)替換成 Security CRT functions 。
? ?注意:這個(gè)方法雖然使用了新的函數(shù),但是不能消除警告(原因見紅字),你還得同時(shí)使用方法二(-_-)。即實(shí)際應(yīng)在預(yù)編譯頭文件 stdafx.h 里加入下面兩句:
? ?#define _CRT_SECURE_NO_DEPRECATE
? ?#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
Note:使用了方法二的2/3沒效果,1可以
轉(zhuǎn)自:https://www.cnblogs.com/gb2013/archive/2013/03/05/SecurityEnhancementsInTheCRT.html
總結(jié)
以上是生活随笔為你收集整理的error c4996: 'fopen' This function or variable may be unsafe如何解决的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 罗德里格斯(Rodrigues)旋转向量
- 下一篇: 让程序结果在屏幕上暂停一段时间