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

       自从微软搞了一套字符安全函数( 特征是 '_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 2009-03-13 13:27  norsd  阅读(325)  评论(0编辑  收藏  举报

导航