Visual c++ fopen不推荐的警告 在VisualStudio 2005 C++编译器中,当我的代码使用 fOpen< /Stand >调用时,我得到以下警告: 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.'

Visual c++ fopen不推荐的警告 在VisualStudio 2005 C++编译器中,当我的代码使用 fOpen< /Stand >调用时,我得到以下警告: 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.',visual-c++,fopen,deprecated,Visual C++,Fopen,Deprecated,如何防止这种情况发生?看起来微软已经否决了许多使用缓冲区来提高代码安全性的调用。然而,他们提供的解决方案是不可移植的。无论如何,如果您对使用他们调用的安全版本不感兴趣(如fopen\u s),则需要在包含的头文件之前放置\u CRT\u secure\u NO\u DEPRECATE的定义。例如: #define _CRT_SECURE_NO_DEPRECATE #include <stdio.h> \define\u CRT\u SECURE\u NO\u反对 #包括 也可以将

如何防止这种情况发生?

看起来微软已经否决了许多使用缓冲区来提高代码安全性的调用。然而,他们提供的解决方案是不可移植的。无论如何,如果您对使用他们调用的安全版本不感兴趣(如fopen\u s),则需要在包含的头文件之前放置\u CRT\u secure\u NO\u DEPRECATE的定义。例如:

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
\define\u CRT\u SECURE\u NO\u反对
#包括
也可以将预处理器指令添加到项目设置中,以对项目下的所有文件生效。为此,请在项目属性->配置属性->C/C++->预处理器->预处理器定义中添加\u CRT\u SECURE\u NO\u DEPRECATE

您可以添加:

#pragma warning (disable : 4996)
在使用fopen之前,您是否考虑过按照警告建议使用fopen_s?它返回一个错误代码,允许您检查函数调用的结果


只有禁用微软函数警告的问题可能会在CRT的稍后版本中删除所讨论的函数,从而破坏代码(如下面的注释中所示,在FC++中,这不会发生在这个实例中,因为它是C&C+ISO标准的一部分)。.

考虑使用可移植性库,如或。这些电话通常提供安全、便携的替代电话。这也是一件好事,因为这些不安全的调用在大多数现代环境中都是不受欢迎的。

这只是微软的厚颜无耻。“弃用”指标准委员会颁布的标准语言/标准库未来版本中可能不提供的语言功能。这并不意味着,也不应该意味着,“我们单方面认为您不应该使用它”,无论该建议有多么充分的根据。

如果您的代码是针对不同的操作系统(如MacOSX、Linux)编写的,您可以使用以下内容:

#ifdef _WIN32
#define _CRT_SECURE_NO_DEPRECATE
#endif

我也有同样的问题。当我尝试添加opencv库时

#include <opencv\cv.h>
我还使用了前面提到的预处理器指令。但这并没有解决问题

我通过以下方法解决了这个问题:

  • 转到属性->C/C++->预编译头->选择不在预编译头中使用预编译头。

如果您希望在许多平台上使用它,您可以使用以下注释定义:

#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

微软的许多安全功能,包括fopen_s(),都是C11的一部分,因此现在它们应该是可移植的。您应该认识到,安全函数在异常行为和返回值方面有所不同。此外,您需要注意,虽然这些函数是标准化的,但它是标准的可选部分(附录K),至少glibc(Linux上的默认设置)和FreeBSD的libc没有实现

然而,我与这个问题斗争了几年。我发布了一组更大的转换宏,针对您当前的问题,将以下代码放在一个include文件中,并将其包含在源代码中:

#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
#pragma一次
#如果!已定义(FCN_S_宏)
#定义FCN\u S\u宏
#包括
#包括//
使用名称空间std;
//MSC\u VER=1400是MSVC 2005_MSC_VER=1600(MSVC 2010)为当前版本
//当我编写(其中一些)这些宏时。
#if(已定义(_MSC_VER)&(_MSC_VER>=1400))
内联外部
文件*fcnSMacro\u fopen\s(字符*fname,字符*模式)
{文件*fptr;
fopen_s(和fptr、fname、mode);
返回fptr;
}
#定义fopen(fname,mode)fcnSMacro_fopen_s((fname,(mode))
#否则
#定义fopen_s(fp,fmt,mode)*(fp)=fopen((fmt),(mode))
#endif/\u MSC\u VER
#endif//FCN\u S\u宏

当然,此方法不会实现预期的异常行为。

对于使用Visual Studio 2017版本的用户,运行不安全操作所需的预处理器定义似乎已更改。改用:

#define _CRT_SECURE_NO_WARNINGS

然后将编译。

我正在使用VisualStdio 2008。 在这种情况下,我经常设置预处理器定义

菜单\Project\[ProjectName]属性。。。Alt+F7

如果单击此菜单或在项目窗口中按Alt+F7,您可以看到“属性页”窗口

然后查看窗口左侧的菜单

配置属性\C/C++\Preprocessor


然后添加<强> >代码>“C++”/“代码> < /强> > <强> >预处理器定义< /强> ./p>“微软可以删除CRT的后一版本中的问题”——如果他们不再希望实现C或C++标准。有些人也会针对非MS平台。对于未来的谷歌用户来说:

在这种情况下,“弃用”只意味着不推荐使用函数;这并不表示该功能计划从CRT中删除。
-++++++@SteveJessop他们已经有意打破了标准。请参阅。在VS2013中,我需要使用
#pragma warning(disable:4996)
,因为建议的
\u CRT\u SECURE\u NO\u WARNINGS
\u CRT\u SECURE\u NO\u DEPRECATE
都不起作用。
#define
s似乎在其他上下文中起作用,因此提醒大家这似乎是不一致的。英语单词“deprecate”的含义正是第二件事:“我们认为你不应该使用它”。但用计算机术语来说,它最近的含义要弱得多,“使用它可能是不明智的,因为我们正在考虑删除它,我们提供了一些我们认为更好的东西”。不过,你可能应该这样做:#ifdef#WIN32#define#CRT(安全)NO#DEPRECATE#endif#包括其他p
#define _CRT_SECURE_NO_WARNINGS