2011-04-15 33 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并不意味着什么给普通用户,但如果(详细)一样。