2012-08-24 68 views
2

我想在宏中使用預處理器指令?可以/如何完成?如何在C預處理器宏中使用#?

#define  HTTP_REQUEST_RETURN_ERROR(error) *errCode = error; 
               #ifdef DEBUG 
                 LeaveCriticalSection(&debugOutputLock); 
               #endif 
               return NULL 

在此先感謝, 焦裏。

回答

7

您還可以,當然,定義宏兩次,不同的定義:

#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),上述將是一個語法錯誤,因爲那裏將是ifelse之間的多條語句。只是增加括號來宏擴展不是很乾淨,因爲像所希望的語句狀使用上述將導致

if(httpRequestFailed()) 
    { ... /* code omitted */ }; 

擴張這不是很乾淨,括號下面的一個代碼範圍通常不遵循用分號分隔。

+0

爲什麼你必須把它包裝在臨時聲明中? – Jori

+0

@Jori這是一種編寫「代碼塊」的便攜方式。 –

+0

感謝您的解釋! – Jori

4

您不能在#define中嵌套預處理器指令。

+0

這是一個恥辱。我實際上曾經嘗試創建一個新的宏,但如果我的宏名已被使用,則會出現編譯器錯誤。太糟糕了,它沒有奏效。 – chris

0

Define DEBUG然後使用正常的if語句。

#define DEBUG 0 

#define HTTP_REQUEST_RETURN_ERROR(error) *errCode = error; 
              if (DEBUG) LeaveCriticalSection(&debugOutputLock); 
              return NULL