亡羊补牢——This function or variable may be unsafe

今天遇到了编译器报错:

error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

那么第一个问题就是:为什么unsafe呢?

查了一下资料,发现这其实是一个c语言标准函数引起的内存不安全的问题:

C语言的标准函数中,一些读取或写入内存的函数存在内存越界的问题,从而使得内存数据变得不安全。如scanf、gets、strcat等函数都存在着这样的问题。 
为了避免这个问题,在VS中,另外提供了如scanf_s,get_s,strcat_s等相关的改进函数,来替代原来的标准函数的功能,并通过添加内存读取范围的限制来解决不安全的问题。 
在实际的应用中,也许使用VS提供的安全函数会更加合理。但是,在学习中,几乎所有的课本以及教程都使用的原来的标准函数,另外考虑到移植性的问题,除了VS环境,其他环境中并没有提供改进后的函数。因此,我们通常任然需要标准的库函数来实现相关功能。 
但是,如果在VS中使用原始的函数,编译器将会报错。这对使用和学习都带来了相当的不变。

好了,思路大致清晰了,但是当我们确定不会引发内存问题却还是想用这个函数的时候该怎么解决这个不可忽略的“Warning”呢?实际上编译器为我们提供了一个很明确的解决方案:“如果要取消禁用,请定义_CRT_SECURE_NO_WARNINGS。 ”就是说我们要对预处理器做一些文章。

第一个想法就是,我在cpp中宏定义一个_CRT_SECURE_NO_WARNINGS,原代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    char c[20];
    scanf("%s", c);
    puts(c);
    return 0;
}

第二个想法是,为了不在每个cpp中都定义这样的宏,我们直接在项目属性——配置属性——C/C++选项——预处理器(Preprocessor),找到预处理器定义并编辑参数——添加_CRT_SECURE_NO_WARNINGS,问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值