用于可选日志记录的预处理器调试宏

时间:2009-10-22 01:38:08

标签: objective-c debugging c-preprocessor

我想在一些预处理器宏中编写代码以选择性地记录一些信息。例如在.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
在.m中的

我实现如下:

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或是否有一种不那么密集的方法来执行此操作。或许我的临时调试日志记录的整个方法都是错误的?

1 个答案:

答案 0 :(得分:4)

最简单的是一个空的定义:

#define ML_DEBUG(x)

这适用于大多数情况,但它不适用于三元运算符,例如:

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

为了解决这个问题(公认的做法),你可以这样做:

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

将事物转化为无效是完全有效的 - 它告诉编译器你明确忽略了表达式的结果。

由于这个原因,当定义assert()而不是空语句时,标准ANSI C宏((void)0)变为NDEBUG