雖然自己的 Blog 中有一篇關於“宏陷阱”的文章,可是在最近的工作中自己卻沒有意識到這個常規的宏“陷阱”,自己中招了。
hr = HRESULT_FROM_WIN32(foo()) 就是這條語句給我們鋪設了陷阱
這個宏的定義:
((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000)))
在這裏 foo()) 被替換兩次,從而就被調用兩次導致了錯誤。這正是常規的 :Duplication of Side Effects 陷阱。
這個問題是被別人發現的,然後反饋到我們這裏。而之前我們還一直以爲是別人的錯誤,現在感覺真是不應該發生這種錯誤,真的沒面子。以後真的要小心啊!提醒大家用宏的時候一定要小心!以免中招。