2009-10-22 80 views
0

我想在某些预处理器宏中编写代码来选择性地记录某些信息。例如在.M的.H用于可选日志记录的预处理器调试宏

//#define ML_DEBUG(x) (x) // flip this bit to do the error logging 
#define ML_DEBUG(x) (1==1) // flip this bit to silence 

我实现诸如:

ML_DEBUG(NSLog(@"Class dealloc: %@", [NSString stringWithCString:object_getClassName(self)])); 

,因为我已经提出了它的代码工作正常。不过,我认为我的“无所事事”案件的重量轻得可怕。我早就预料到写:

//#define ML_DEBUG(x) (x) // flip this bit to do the error logging 
#define ML_DEBUG(x) (;) // flip this bit to silence 

因为一个孤独分号是一个有效的Objective-C的说法,我希望这会工作,但编译器告诉我:

expected expression before ';' token 

我的问题是:我通过使用1==1来选择最轻量级的“无所事事”声明,或者有没有一种不太密集的方式来做到这一点。或者,也许我的整个临时调试日志记录的方法是错误的?

回答

4

最简单的事情是空的定义:

#define ML_DEBUG(x) 

这适用于大多数情况下,但它不会与三元运算符,如工作:

something ? ML_DEBUG(x) : ML_DEBUG(y); 

为了这个工作(不可否认的做法)的例子,你可以这样做:

#define ML_DEBUG(x) ((void)0) 

这是完全有效的铸件无效 - 它告诉编译器你明确地忽略了表达式的结果。

正因为如此原因,当定义NDEBUG而不是空语句时,标准ANSI C宏assert()变为((void)0)