1、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.
原因
這種微軟的警告,主要因爲那些C庫的函數,很多函數內部是不進行參數檢測的(包括越界類的),微軟擔心使用這些會造成內存異常,所以就改寫了同樣功能的函數,改寫了的函數進行了參數的檢測,使用這些新的函數會更安全和便捷。關於這些改寫的函數你不用專門去記憶,因爲編譯器對於每個函數在給出警告時,都會告訴你相應的安全函數,查看警告信息就可以獲知,在使用時也再查看一下MSDN詳細瞭解。庫函數改寫例子:
mkdir改寫爲 _mkdir
fopen”改寫爲 fopen_s
stricmp改寫爲 stricmp_s
sprintf改寫爲sprintf_s
strcpy改寫爲strcpy_s
解決
1、VS2005後使用帶“_s”後綴的非標準函數,如sprintf改爲sprintf_s
char filename[1024];//需要預先分配緩衝區
char path1[128] = "D:\\Program\\Tesseract-OCR\\tesseract.exe";
char path2[128] = "D:\\Program\\Tesseract-OCR\\";
//sprintf(filename, "%s %s", path1,path2);
sprintf_s(filename, sizeof( filename ), "%s %s", path1,path2);
2、項目屬性->配置屬性->C/C++ ->預處理器(Preprocessor)->預處理器定義(Preprocessor Definitions)
添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE這兩個宏。
2、error C4996: ‘inet_addr’: Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings
原因
在VS2013以後的版本中,增加了inet_pton()、InetPton()之類的新函數,用於IP地址在“點分十進制”和“二進制整數”之間轉換,並且能夠處理ipv4和ipv6。而inet_addr是老函數,高版本VS在編譯時默認使用了新函數,所以會報該錯誤。
解決
1、用所提示的inet_pton新函數代替inet_addr函數。
#include <ws2tcpip.h>
... ...
//sockAddr.sin_addr.s_addr = inet_addr(ip);
inet_pton(AF_INET, ip, &sockAddr.sin_addr);
2、修改VS配置如下(兩種):
a、項目 -> 屬性 -> C/C++ ->常規(General)->SDL檢查(SDL checks),將“是(Yes)”改爲“否(No)”,即可使用老函數。
b、項目屬性->配置屬性->C/C++ ->預處理器(Preprocessor)->預處理器定義(Preprocessor Definitions)
添加“_CRT_SECURE_NO_WARNINGS”