您還可以,當然,定義宏兩次,不同的定義:
#if defined DEBUG
#define HTTP_REQUEST_RETURN_ERROR(error) do { *errCode = error;\
LeaveCriticalSection(&debugOutputLock);\
return NULL;\
} while(0)
#else
#define HTTP_REQUEST_RETURN_ERROR(error) do { *errCode = error;\
return NULL;\
} while(0)
#endif
這使得一定要避免(平凡優化的)運行時間xdazz使用if
。它還包含典型的do ... while
中的宏體,使其看起來像一個聲明。
UPDATE:澄清,在C多語句宏在do ... while(0)
環通常包裹(宏定義),因爲這使得整個文本轉換爲單一語句。這使得宏的使用可以很好地適用於作用域和分號。
例如,考慮一下:
if(httpRequestFailed())
HTTP_REQUEST_RETURN_ERROR(404);
else
processResults();
沒有do ... while(0)
,上述將是一個語法錯誤,因爲那裏將是if
和else
之間的多條語句。只是增加括號來宏擴展不是很乾淨,因爲像所希望的語句狀使用上述將導致
if(httpRequestFailed())
{ ... /* code omitted */ };
擴張這不是很乾淨,括號下面的一個代碼範圍通常不遵循用分號分隔。
爲什麼你必須把它包裝在臨時聲明中? – Jori
@Jori這是一種編寫「代碼塊」的便攜方式。 –
感謝您的解釋! – Jori