读书人

看不懂vc2005的CRT的assert的宏,该怎么

发布时间: 2012-03-06 20:47:55 作者: rapoo

看不懂vc2005的CRT的assert的宏
宏定义如下:
#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )

疑问:
1. (!!(_Expression))的存在可以理解为一旦_Expression为真,则右边的函数无需调用,可以提高效率,可是为什么要在_Expression前面加两个!!?
2. 右边为什么(_wassert(...),0)?这个逗号运算符放在这儿显得毫无意义啊?
我大概猜这么定义是为了对付某些特殊的情况。有大牛能指点一下这些设计上的问题上吗?

[解决办法]
#define assert(_Expression)
(void)
(
(!!(_Expression))
|| (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0)
)

逗号运算返回最后那个数值
也就是说
_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__)如果失败就会报错
而成功后则会返回0
!!(_Expression)这样的用意是让编译器认为_Expression是一个bool数值

读书人网 >C++

热点推荐