在Visual Studio 2005中C ++编译器 ,我得到以下警告时,我的代码使用的fopen和这样的电话。
1>foo.cpp(5) : warning C4996: 'fopen' was declared deprecated
1> c:\program files\microsoft visual studio 8\vc\include\stdio.h(234) : see declaration of 'fopen'
1> Message: '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.'
如何避免这种情况?
Answer 1:
它看起来像微软不赞成大量使用该缓冲区来提高代码的安全调用。 然而,他们提供解决方案不便于携带。 无论如何,如果你不感兴趣,使用他们的电话的安全版本(如fopen_s),您需要将_CRT_SECURE_NO_DEPRECATE的定义你包含的头文件之前。 例如:
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
预处理指令也可以添加到您的项目设置,以实现它的所有项目下的文件。 要做到这一点添加_CRT_SECURE_NO_DEPRECATE到项目属性- >配置属性- > C / C ++ - >预处理器- >预处理器定义 。
Answer 2:
那么你可以添加:
#pragma warning (disable : 4996)
使用前的fopen,但你有没有考虑使用fopen_s作为警告提示? 它返回一个错误代码,从而可以检查函数调用的结果。
只有禁用弃用功能的警告的问题是,微软可能会删除功能的问题在CRT更高版本,打破你的代码(如在评论下面所述,这将不会在这种情况下使用的fopen发生,因为它的一部分在C&C ++ ISO标准)。
Answer 3:
这只是微软那么厚脸皮。 “弃用”意味着可能无法在标准语言/标准库的未来版本中提供,由标准委员会颁布作为一个语言功能。 这不,还是不应该的意思是,“我们单方面,不认为你应该使用它”,无论多么有理有据他的意见是。
Answer 4:
如果你的代码是为不同的操作系统(例如Mac OS X和Linux)你可以使用下列内容:
#ifdef _WIN32
#define _CRT_SECURE_NO_DEPRECATE
#endif
Answer 5:
考虑使用便携库像巧舌如簧或Apache的便携式运行 。 这些通常会提供安全,轻便的替代品,以这样的电话。 这太一件好事,因为这些不安全的调用是最现代化的环境中弃用。
Answer 6:
我'使用VisualStdio 2008年。在这种情况下,我经常设置Preprocessor Definitions
菜单\项目\ [项目]属性... Alt键+ F7
如果单击项目窗口这个菜单或者按Alt + F7,可以看到“属性页”窗口。
然后看到窗口的左侧菜单。
配置属性\ C / C ++ \预处理
然后加入_CRT_SECURE_NO_WARNINGS
到\预处理定义 。
Answer 7:
如果你希望它在许多平台上使用,可以作为评价使用定义,如:
#if defined(_MSC_VER) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) \
|| defined(WIN64) || defined(_WIN64) || defined(__WIN64__)
errno_t err = fopen_s(&stream,name, "w");
#endif
#if defined(unix) || defined(__unix) || defined(__unix__) \
|| defined(linux) || defined(__linux) || defined(__linux__) \
|| defined(sun) || defined(__sun) \
|| defined(BSD) || defined(__OpenBSD__) || defined(__NetBSD__) \
|| defined(__FreeBSD__) || defined __DragonFly__ \
|| defined(sgi) || defined(__sgi) \
|| defined(__MACOSX__) || defined(__APPLE__) \
|| defined(__CYGWIN__)
stream = fopen(name, "w");
#endif
Answer 8:
对于那些使用Visual Studio 2017年的版本是谁,好像运行不安全的操作所需的预处理器定义已经改变。 改用:
#define _CRT_SECURE_NO_WARNINGS
它将编译即可。
Answer 9:
许多微软的安全功能,包括fopen_s(),是C11的一部分,所以他们现在应该可以移植。 你应该认识到,安全功能的异常行为,有时在返回值不同。 另外,你需要知道的是,虽然这些功能是标准化的,它的标准(见附件K),至少glibc的(在Linux默认)和FreeBSD的libc中没有实现的可选部分。
但是,我几年打了这个问题。 我张贴一大组转换宏的位置。 为立即解决问题,把下面的代码中包含文件,并将其包含在你的源代码如下:
#pragma once
#if !defined(FCN_S_MACROS_H)
#define FCN_S_MACROS_H
#include <cstdio>
#include <string> // Need this for _stricmp
using namespace std;
// _MSC_VER = 1400 is MSVC 2005. _MSC_VER = 1600 (MSVC 2010) was the current
// value when I wrote (some of) these macros.
#if (defined(_MSC_VER) && (_MSC_VER >= 1400) )
inline extern
FILE* fcnSMacro_fopen_s(char *fname, char *mode)
{ FILE *fptr;
fopen_s(&fptr, fname, mode);
return fptr;
}
#define fopen(fname, mode) fcnSMacro_fopen_s((fname), (mode))
#else
#define fopen_s(fp, fmt, mode) *(fp)=fopen( (fmt), (mode))
#endif //_MSC_VER
#endif // FCN_S_MACROS_H
当然,这种方法并没有实现预期的异常行为。
Answer 10:
我也得到了同样的问题。 当我尝试添加OpenCV库
#include <opencv\cv.h>
我不是一个警告,但一个错误。
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. c:\program files (x86)\opencv\build\include\opencv2\flann\logger.h
我也用预处理指令提到。 但是,这并没有解决问题。
我解决了它这样做如下:
- 进入属性- > C / C ++ - >预编译头- >选择在预编译头不使用预编译头。
文章来源: fopen deprecated warning