Visual Studio中关于scanf警告的修改宏定义两种方式辨析

1.问题引入

        在下载VS后,我们不可避免的需要对其进行兼容性配置。其中最重要的一条就是避免scanf函数出现如下所示的警告信息:

        

        这通常是由于Visual Studio基于安全性考虑,对ANSI的库函数进行了限制,强制使用其自带的函数,而这种做法通常情况下并不值得肯定,不仅会影响代码的兼容性,也极易恐吓到刚入门的新手们。   

        具体到本问题则是标准函数scanf()在对字符数组以%s格式输入时并不检查边界,从而带来了越界溢出的风险,因此Microsoft强制要求使用自带的scanf_s()函数来进行替换,该函数要求输入时有一个第三参数size来确保输入的字符串长度不超过size。

2.解决问题

        当我发现警告时,我在老师的教案和网络的解答中得到了两种一劳永逸的修改方法(在不改变项目的前提下),二者仅有细节的不同。都是从宏定义的修改方面入手,具体步骤参见http://t.csdnimg.cn/JjeM3中的第三、四点方法。

​        

        今天我要讨论的是_CRT_SECURE_NO_WARNINGS和_CRT_SECURE_NO_DEPRECATE有什么区别。

3.区别辨析

       " _CRT_SECURE_NO_WARNINGS" 和" _CRT_SECURE_NO_DEPRECATE"是在C/C++编程中与微软的C运行时库(CRT)相关的预处理器定义。它们用于控制在编译程序时是否生成关于不安全或过时函数的警告。


3.1  _CRT_SECURE_NO_WARNINGS

        这个宏用于关闭所有由CRT库生成的关于不安全函数的警告。
        当使用一些被认为不安全的函数(如`strcpy`、`sprintf`等,它们容易导致缓冲区溢出)时,编译器会发出警告。定义这个宏后,这些警告将被抑制。
        使用这个宏意味着开发者接受使用这些不安全函数的风险,并选择不处理相关的警告。


3.2  _CRT_SECURE_NO_DEPRECATE

        这个宏用于关闭所有由CRT库生成的关于已弃用函数的警告。
        当使用一些已经被标记为弃用的函数时,编译器会发出警告。定义这个宏后,这些警告将被抑制。

        弃用的函数可能是因为有更安全或更有效的替代品,或者因为它们可能在未来的库版本中被移除。

4.总结

        总的来说,`_CRT_SECURE_NO_WARNINGS` 主要用于关闭与安全相关的警告,`_CRT_SECURE_NO_DEPRECATE` 用于关闭与函数弃用相关的警告。使用这些宏可以帮助开发者管理他们的代码警告,但同时也意味着可能忽视了潜在的安全或维护问题。因此,在决定使用这些宏之前,应该仔细评估代码的安全性和长期维护需求。

        个人认为以第二种描述为宜,相对来说错误可能更少。当然也可以直接采用修改C++模版文件的方式来解决。

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值