C++: C4996报错
我的博客:竹山听雨
文章目录
问题描述
- 环境:V2019
- 语言:C++
还是在完成学校作业的时候(ps:好像原来也遇到过很多次了),在VS201x编译器上,使用scanf()
,strcpy()
等,都会出现这个问题。
严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C4996 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
问题出现原因
创建项目时,会有一个勾选项,叫做"安全开发生命周期(SDL)检查",为了更好的监管开发者的代码安全,如果勾选,他将严格按照SDL的规则编译代码,因此一些常用的函数,如scanf
等就会报错C4996
解决方法
使用安全的函数
如scanf()
改为scanf_s()
.strcpy()
改为strcpy_s()
等。这个方法适合长期解决问题,因为scanf等函数的确会对程序造成一些不良影响,但是有些安全函数,如:strcpy_s
和strcpy
原版函数的参数好像不同,对初学者,仅仅是做一个demo来说,可能会有新的bug
添加宏
选择项目——>xxxx(你的项目名称)属性——>C++——>预处理器——>预处理器定义
在定义后面添加_CRT_NONSTDC_NO_DEPRECATE
和_CRT_SECURE_NO_WARNINGS
保存重新编译即可
**注意:**要记得每个定义后面要以;
隔开
这样的方法在本项目中,都会忽略这些报错,但是可能会有些麻烦
添加#define EXAMPLE_MACRO_NAME
若要仅在特定源文件中定义的宏,请添加一个行如#define EXAMPLE_MACRO_NAME
包含的头文件的任意行之前
可能有些时候这个方法没用,暂时不清楚原因
添加#pragma warning(disable:4996)
这个可能是最简单粗暴的解决方法,直接忽略掉C4996
这个报错
在文件首添加#pragma warning(disable:4996)
即可,但是也仅对当前源文件有效
结语
若有哪里不对,敬请大佬指正