虽然自己的 Blog 中有一篇关于“宏陷阱”的文章,可是在最近的工作中自己却没有意识到这个常规的宏“陷阱”,自己中招了。
hr = HRESULT_FROM_WIN32(foo()) 就是这条语句给我们铺设了陷阱
这个宏的定义:
((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000)))
在这里 foo()) 被替换两次,从而就被调用两次导致了错误。这正是常规的 :Duplication of Side Effects 陷阱。
这个问题是被别人发现的,然后反馈到我们这里。而之前我们还一直以为是别人的错误,现在感觉真是不应该发生这种错误,真的没面子。以后真的要小心啊!提醒大家用宏的时候一定要小心!以免中招。
本文通过一个具体的宏使用案例,展示了宏“陷阱”如何在实际工作中引发问题。详细解析了一个宏在处理函数返回值时,由于参数被意外地重复计算而导致的错误,并强调了在使用宏时应注意避免此类陷阱。

1388

被折叠的 条评论
为什么被折叠?



