虽然自己的 Blog 中有一篇关于“宏陷阱”的文章,可是在最近的工作中自己却没有意识到这个常规的宏“陷阱”,自己中招了。
hr = HRESULT_FROM_WIN32(foo()) 就是这条语句给我们铺设了陷阱
这个宏的定义:
((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000)))
在这里 foo()) 被替换两次,从而就被调用两次导致了错误。这正是常规的 :Duplication of Side Effects 陷阱。
这个问题是被别人发现的,然后反馈到我们这里。而之前我们还一直以为是别人的错误,现在感觉真是不应该发生这种错误,真的没面子。以后真的要小心啊!提醒大家用宏的时候一定要小心!以免中招。