如何对某一区域的代码屏蔽警告的方法,及其一些问题

       自从微软搞了一套字符安全函数( 特征是 '_s' ) , 他就把以前那套东西抛弃了, 比如 strcpy, sprintf . 如果您仍然调用, 就会输出一个warning , 一般是 4995 , 4996 .

       这里有个问题, 如果我可以确定我的一部分代码是绝对可靠的, 我又为什么要去使用 _s , 毕竟, 很多人和我一样有洁癖, 代码多出来个_s, 还要为size重新写一个, 太麻烦了.

      我们都知道的一个解决办法是: #pragma warning(disable:4996) ,  很漂亮,可惜通杀. 有时候的确有些地方是有危险的, 这行字却把这些危险也屏蔽了.

      所以为此, 我写了一段宏 , 希望能够解决这个问题:

 

 

#ifdef _MSC_VER

#define DISABLEWARNING( warningValue, expression )      __pragma(warning(push)) __pragma(warning(disable:warningValue)) expression; __pragma(warning(pop))

#define DISWARN  DISABLEWARNING

#endif 

 

 

其中 _MSC_VER 是ms c 的 版本号, 在VC中才会有, 所以用这个来判断这是微软的编译器.

__pragma(....)  是不同于 #pragma , 可以多行的pragma命令, 在这里很有用.

而 push , pop 就是设置屏蔽warning的范围, 在这个宏中, 当且仅当 expression 这个区域才屏蔽warning.

所以你看,我写了下面这行代码,很轻松,不是吗?

 

 

当然,这段代码在某种情况下会失效,别紧张, 请尝试如下代码:

DISWARN( 4995 , ::wsprintf( npwErrInfo, L"%s", L"Hello world!" ) );

你会发现只时候 wsprintf 仍然会引起一个4995的warning. But , how!?

我也不甚了了,也许是多重宏替换的原因,也许不是,如果您知道,不妨告诉我,谢谢.

       解决办法很简单, 把 ::wsprintf 改成最终形态 ::wsprintfW : )

 

posted on   norsd  阅读(326)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏

导航

< 2009年3月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 1 2 3 4
5 6 7 8 9 10 11
点击右上角即可分享
微信分享提示