我試圖做這樣的事情使用宏來放置的#ifdef代碼
#define VB_S #ifdef VERBOSE
#define VB_E #endif
,這樣的代碼,而不是寫
#ifdef VERBOSE
cout << "XYZ" << endl;
#endif
我可以寫
VB_S
cout << "XYZ" << endl;
VB_E
這給了我一個編譯時錯誤:在程序中放置'#'。
任何人都可以放輕對什麼是做到這一點
我試圖做這樣的事情使用宏來放置的#ifdef代碼
#define VB_S #ifdef VERBOSE
#define VB_E #endif
,這樣的代碼,而不是寫
#ifdef VERBOSE
cout << "XYZ" << endl;
#endif
我可以寫
VB_S
cout << "XYZ" << endl;
VB_E
這給了我一個編譯時錯誤:在程序中放置'#'。
任何人都可以放輕對什麼是做到這一點
你可以做這樣的事情:
#ifdef VERBOSE
#define VB(x) x
#else
#define VB(x) do { } while (false)
#endif
VB(cout << "foo");
你不能把裏面的指令宏的正確方法。 (#
宏作爲另一個意義裏面 - 它是字符串化操作和必須遵循的一個參數ID - 但限制要比這個意思以上)
埃裏克的反應類似:
#ifdef VERBOSE
#define VB(...) __VA_ARGS__
#else
#define VB(...) /* nothing */
#endif
使用variadic macro具有可VB()
調用中的逗號的利益。另外,AFAIK,您可以刪除do
... while
。
我更喜歡以下內容:
#define VERBOSE 1
// or 0, obviously
if (VERBOSE)
{
// Debug implementation
}
這是一個有點更具可讀性,因爲VB_S並不意味着什麼給普通用戶,但如果(詳細)一樣。
x可以帶任何東西,例如我可能需要打印矩陣的循環 – Akhil 2011-04-15 16:41:30
@Akhil:對於任何帶嵌入的東西都不會感到滿意 - 您只需製作for循環並使用宏進行打印,編譯器可能會優化掉一個無效的循環如果VERBOSE未定義。 – Erik 2011-04-15 16:43:19
我的大部分照片都是簡單的cout。在同一方面,當我有for循環時,我將使用顯式的ifdef,以及您爲更簡單的語句提供的技巧。非常感謝! – Akhil 2011-04-15 16:52:08