fopen弃用警告

Ash*_*ppa 66 fopen deprecated visual-c++

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.'
Run Code Online (Sandbox Code Playgroud)

我该如何防止这种情况?

Ash*_*ppa 122

看起来微软已经弃用了大量使用缓冲区来提高代码安全性的调用.但是,他们提供的解决方案并不便携.无论如何,如果您对使用其安全版本的调用(如fopen_s)不感兴趣,则需要在包含的头文件之前放置_CRT_SECURE_NO_DEPRECATE的定义.例如:

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)

预处理程序指令也可以添加到项目设置中,以在项目下的所有文件上实现它.为此,将_CRT_SECURE_NO_DEPRECATE添加到项目属性 - >配置属性 - > C/C++ - >预处理器 - >预处理器定义.

  • 你可能应该这样做:#ifdef _WIN32 #define _CRT_SECURE_NO_DEPRECATE #endif #include <stdio.h>因为其他平台不需要在编译期间定义. (9认同)

Joh*_*bly 26

那么你可以添加一个:

#pragma warning (disable : 4996)
Run Code Online (Sandbox Code Playgroud)

在你使用fopen之前,你是否考虑过使用fopen_s作为警告?它返回一个错误代码,允许您检查函数调用的结果.

仅仅禁用已弃用的功能警告的问题是,Microsoft可能会在更高版本的CRT中删除相关功能,从而破坏您的代码(如下面的注释中所述,这不会发生在fopen的这个实例中,因为它是C&C++ ISO标准).

  • "微软可能会在更高版本的CRT中删除相关功能" - 如果他们不再希望实施C或C++标准. (36认同)
  • 对于未来的googlers:`在这种情况下,"弃用"只是意味着不建议使用函数; 它并不表示该功能计划从CRT中删除. - [msdn](http://msdn.microsoft.com/en-us/library/8ef0s5kh.aspx) ++++ (13认同)
  • 有些人也会针对非MS平台.并且有很多这些_s函数,并没有真正明显的安全性增益. (4认同)
  • 在VS2013中,我需要使用`#pragma warning(disable:4996)`因为建议的`_CRT_SECURE_NO_WARNINGS`和`_CRT_SECURE_NO_DEPRECATE`都不起作用.`#define`s似乎在其他环境中起作用,因此提出这似乎是不一致的实现. (4认同)

tra*_*los 13

这只是微软的厚颜无耻."弃用"意味着标准委员会规定的标准语言/标准库的未来版本中可能未提供的语言特征.它没有,或者不应该意味着"我们,单方面地,不认为你应该使用它",无论这个建议有多么有根据.

  • 英语单词"deprecate"的含义恰恰是第二件事:"我们认为你不应该使用它".但是用计算机的说法,它最近的意义却要弱得多,"使用它可能不明智,因为我们考虑去除它,我们提供了一些我们认为更好的东西". (14认同)

Mag*_*ron 8

如果您的代码适用于其他操作系统(如Mac OS X,Linux),则可以使用以下命令:

#ifdef _WIN32
#define _CRT_SECURE_NO_DEPRECATE
#endif
Run Code Online (Sandbox Code Playgroud)


小智 5

我使用的是 VisualStdio 2008。在这种情况下,我经常设置 Preprocessor Definitions

菜单 \ 项目 \ [项目名称] 属性... Alt+F7

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

然后看到窗口左侧的菜单。

配置属性\C/C++\预处理器

然后添加_CRT_SECURE_NO_WARNINGS\Preprocessor Definitions