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

有帮助吗?

解决方案

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

#define ML_DEBUG(x)

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

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

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

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

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

因此,当定义 NDEBUG 时,标准ANSI C宏 assert()变为((void)0)而不是空的陈述。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top