我想在一些预处理器宏中编写代码以选择性地记录一些信息。例如在.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
或是否有一种不那么密集的方法来执行此操作。或许我的临时调试日志记录的整个方法都是错误的?
答案 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
。