2016-08-02 98 views
1

我想插入一些調試輸出語句到一個大的C代碼庫。這些調試輸出語句將由編譯器選項開關控制。如何編寫擴展爲`#ifdef ...#endif`宏塊的C宏?

調試輸出語句如下所示:

#ifdef DEBUG_FLAG 
Print(someSymbol) 
#endif 

爲了節省一些打字,我想知道是否有可能定義一個簡單的宏,擴展到上述調試輸出語句塊?

例如:

#define DBG_MACRO(someSymbol) (something that can expand to above) 
+0

這不能作爲替代值來完成,這裏的另一個宏本身會導致編譯時錯誤。 – sjsam

+0

[相關](http://stackoverflow.com/q/283​​1934/335858) – dasblinkenlight

+1

如果你想使用一個宏來進行調試打印,那麼請查看[C##define宏用於調試打印](http:// stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing/)。至少在某種程度上有誘惑力把它作爲一個重複來關閉它。 –

回答

7

你不能把預處理指令預處理宏裏面。

然而,沒有什麼阻止你定義哪些什麼也不擴展宏:

#ifdef DEBUG_FLAG 
# define Print(x) Print(x) 
#else 
# define Print(x) 
#endif 

// Expands to an empty statement if DEBUG_FLAG were not set and 
// to a call to Print(something) if DEBUG_FLAG were set. 
Print(something); 

以上取決於Print是其已聲明/定義的函數。如果使用DEBUG_FLAG集定義宏,則宏將被自己「替換」,但C預處理器擴展不是遞歸的,因此擴展只發生一次,導致調用Print

5

這樣做是不可能的;但是,有條件地定義一個宏很容易:

#ifdef DEBUG_FLAG 
    #define DBG_MACRO(arg) Print(arg) 
#else 
    #define DBG_MACRO(arg) 
#endif