error C4996: 'scanf': This function or variable may be unsafe的解决方法
1、问题描述
在vs2013工程的使用中,当我们使用scanf、fopen等函数时,经常会遇到vs软件安全性检测引起的报错。如下,以使用scanf为例,显示的错误信息如下:
error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
如上报错信息,告知我们scanf这个函数可能是不安全的,并建议我们使用scanf_s去替代它。此外,也给了我们提示可以使用_CRT_SECURE_NO_WARNINGS去屏蔽这个报错信息
那么如果我们真的懒得将scanf、fopen等函数换成其对应的安全性函数scanf_s、fopen_s的话,可以使用以下介绍的三种解决方案:
2、解决方案
2.1、使用#define _CRT_SECURE_NO_WARNINGS宏定义
在报错的文件最前面加上#define _CRT_SECURE_NO_WARNINGS这个宏定义。注意要加在#include前面,如下:
2.2、使用#pragma warning(disable:4996)
在报错的文件中加上如下的预处理指令(加在报错的函数前的任意位置都行,但建议将其加在#include后面):
#pragma warning(disable:4996)
其作用就是屏蔽 4996号(这个错误编号在报错信息里是有说明的)的警告信息,使工程正常编译。如下:
2.3、通过修改vs工程属性的预处理器定义进行解决
上述的两个方法都是针对单一文件中进行修改的;其安全性检测关闭的作用范围也是只对当前文件有效。若要对整个工程文件的安全性检测进行关闭;可以通过如下步骤进行:
(1)、Project Properties -> Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions
若您的vs是汉化版本,对应的操作如下:右键当前工程名 -> 属性 -> 配置属性 -> C/C++ ->预处理器 -> 预处理定义
(2)、点击上图中预处理定义后面的下三角箭头 -> 编辑 -> 在最下面输入如下指令并进行保存。
_CRT_SECURE_NO_WARNINGS
总结
当我们在vs中使用scanf、fopen等函数时,经常会遇到vs软件安全性检测引起的报错。此时若不想将报错函数更换成其指定的安全性函数。可以通过如下三种方式解决:
- 在文件开头加上#define _CRT_SECURE_NO_WARNINGS这个宏定义
- 在文件开头加上#pragma warning(disable:4996)这个预处理指令
- 通过修改vs工程属性的预处理器定义进行解决
其中,前面两点是比较方便的,但注意其安全性检测关闭的作用范围只是对当前文件有效;最后一种则是针对整个工程文件进行的修改。所以,如果我们想完全不做安全检查,就使用最后这种方法;如果只是想针对某些文件不做安全性检查,则可以在这些文件中使用前面两种方法。