2012-02-09 134 views
1

如果我的文件的開頭我預處理宏

#define dbg_kprintf \ 
    if (x_var) kprintf 

我遲到不使用語句

dbg_kprintf ("blablabla"); 

我的問題是,將dbg_kprintf只有當XVAR定義別的地方定義呢?如果不是,那麼編譯時不會使用dbg_kprintf語句嗎?

謝謝。

回答

3

不,在這個例子中,x_var必須存在某處,否則它將無法編譯。您正在尋找類似於


#if (x_var) 
    #define dbg_kprintf kprintf 
#else 
    #define dbg_kprintf 
#endif 
4

不,這將編譯爲變量的運行時檢查,或者什麼都不編譯(如果變量實際上是編譯時常量,且值爲假,優化器感覺就像消除了死代碼)或者調用總是(如果它是一個具有真實值的編譯時常量)。所以,現在你知道了。

確保從非調試構建中排除調試代碼的典型方法是使用預處理器符號來保護代碼。請注意,它可能需要您以不同方式管理參數。

0

dbg_kprintf將被使用之前 complie時間。預處理器將替換您定義的內容:if (x_var) kprintf。然後它會嘗試正常編譯你的代碼。

1

在C/C++宏中可以帶參數。它將以任何方式定義,因爲它只是一個預處理指令,但如果沒有定義,編譯將會失敗。要將參數傳遞給宏,請使用此語法

#define foo(X) ((X))