2011-04-15 66 views
0

我試圖做這樣的事情使用宏來放置的#ifdef代碼

#define VB_S #ifdef VERBOSE 
#define VB_E #endif 

,這樣的代碼,而不是寫

#ifdef VERBOSE 
    cout << "XYZ" << endl; 
#endif 

我可以寫

VB_S 
    cout << "XYZ" << endl; 
VB_E 

這給了我一個編譯時錯誤:在程序中放置'#'。

任何人都可以放輕對什麼是做到這一點

回答

3

你可以做這樣的事情:

#ifdef VERBOSE 
#define VB(x) x 
#else 
#define VB(x) do { } while (false) 
#endif 


VB(cout << "foo"); 
+0

x可以帶任何東西,例如我可能需要打印矩陣的循環 – Akhil 2011-04-15 16:41:30

+0

@Akhil:對於任何帶嵌入的東西都不會感到滿意 - 您只需製作for循環並使用宏進行打印,編譯器可能會優化掉一個無效的循環如果VERBOSE未定義。 – Erik 2011-04-15 16:43:19

+0

我的大部分照片都是簡單的cout。在同一方面,當我有for循環時,我將使用顯式的ifdef,以及您爲更簡單的語句提供的技巧。非常感謝! – Akhil 2011-04-15 16:52:08

6

你不能把裏面的指令宏的正確方法。 (#宏作爲另一個意義裏面 - 它是字符串化操作和必須遵循的一個參數ID - 但限制要比這個意思以上)

2

埃裏克的反應類似:

#ifdef VERBOSE 
#define VB(...) __VA_ARGS__ 
#else 
#define VB(...) /* nothing */ 
#endif 

使用variadic macro具有可VB()調用中的逗號的利益。另外,AFAIK,您可以刪除do ... while

2

我更喜歡以下內容:

#define VERBOSE 1 
// or 0, obviously 

if (VERBOSE) 
{ 
// Debug implementation 
} 

這是一個有點更具可讀性,因爲VB_S並不意味着什麼給普通用戶,但如果(詳細)一樣。