2014-11-06 39 views
1

我有一個宏,檢查錯誤狀態。如果有錯誤,它會記錄結果並返回方法。VC C++宏執行/評估每次在宏中使用宏參數

CHECKHR_FAILED_RETURN(hr) if(FAILED(hr)){LOGHR_ERROR(hr); return hr;} 

宏被稱爲像這樣:

CHECKHR_FAILED_RETURN(_recordingGraph->StopRecording(&currentFile)); 

然而,如果結果確實FAILED(hr),再次執行方法來執行LOGHR_ERROR(hr)。我明白了爲什麼我的StopRecording在出現錯誤的情況下被調用兩次,所以我的問題是...

如何評估宏中參數的結果,但在同一個宏中多次使用它?

UPDATE:基於以下建議

,我改變了我的宏以下。

#define CHECKHR_FAILED_RETURN(hr) do { \ 
    HRESULT result = hr; \ 
    if(FAILED(result)) \ 
    { \ 
     LOGHR_ERROR(result); \ 
     return result; \ 
    } \ 
} while (false); 

#define CHECKHR_FAILED(hr) do { \ 
    HRESULT result = hr; \ 
    if(FAILED(result)) \ 
    { \ 
     LOGHR_ERROR(result); \ 
     return true; \ 
    } \ 
    else \ 
    { \ 
     return false; \ 
    } \ 
} while (false); 
+1

東西是一些東西,宏是邪惡的,做一個功能,別的東西(更嚴重的說明,我不知道這很容易實現,如果有的話) – Borgleader 2014-11-06 16:49:41

+0

你可以發佈代碼,我們有些人無法查看圖像。 – Barry 2014-11-06 16:59:12

+0

這看起來像你試圖用宏來檢查錯誤。你可以考慮一個'try'-'catch'塊。 – 2014-11-06 17:10:19

回答

1

正如一位評論者所說,在每個可能的地方都喜歡一個函數。在這種情況下,這是不可能的,因爲你想在代碼中嵌入return

您可以對宏內的臨時變量進行賦值,並使用它來代替多次調用該參數。

#define CHECKHR_FAILED_RETURN(hr) do{ HRESULT hr2=hr; if(FAILED(hr2)) {LOGHR_ERROR(hr2); return hr2; }}while(false) 

do環是成語確保宏可以在if使用 - else就像一個函數調用。使用C++ 11及以後,您可以使用lambda表達式。

+0

我寫下了這個,但是用「\」使事情變得更清晰。檢查我的答案更新。 – 2014-11-06 21:32:23

+0

@PaulKnopf:'do'的大部分目的是能夠寫出'if(blahblah)MACRO(); else {stuff; }'。當宏以分號結尾時失敗。因爲這兩個分號然後在'if'之後表示一個空語句,所以'else'變爲斷開連接。 – 2014-11-06 22:39:24