VS 常見編譯問題

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”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章