首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-06 
看不懂vc2005的CRT的assert的宏宏定义如下:#defineassert(_Expression)(void)((!!(_Expression))||(_wasse

看不懂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数值

热点排行