的fopen弃用警告(fopen deprecated warning)

2019-07-18 08:51发布

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