如何对某一区域的代码屏蔽警告的方法,及其一些问题
自从微软搞了一套字符安全函数( 特征是 '_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 : )
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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的强缓存和协商缓存
· 一文读懂知识蒸馏