在PCH文件中定义宏以发出警告

时间:2011-08-25 01:48:12

标签: iphone objective-c ios cocoa-touch pch

我的PCH文件中有以下宏。

#ifdef DEBUG
    #define MYLOG(...) NSLog(__VA_ARGS__)
#else
    #define MYLOG(...) MYSERVERLOG(MYObject.enableLogging, __VA_ARGS__)
#endif

#define MYSERVERLOG(iLog, ...) iLog ? NSLog(__VA_ARGS__) : TRUE

现在,无论我把DEBUG = 0还是DEBUG = 1,它总是在第一个子句中。但是,如果我在PCH中使用“if”而不是“ifdef”进行DEBUG,那么它可以正常工作但我会在我的所有MYLOG语句中收到警告,说“未使用表达结果”。

我怎样摆脱这种情况?

2 个答案:

答案 0 :(得分:2)

我猜你只有在DEBUG = 0时才会收到警告。问题是,在运行预处理器之后,编译器会看到如下代码:

...
MYObject.enableLogging ? NSLog(@"your log",...) : TRUE;
...

编译器可以让你忽略函数的结果,假设函数做了你想做的任何事情而且结果没用。但是,当您遇到使用三元运算符计算代码中的值的麻烦时,它希望您需要该计算的结果。如果您知道永远不会使用此宏的结果,则可以将其转换为void以忽略它:

#define MYSERVERLOG(iLog, ...) ((void)(iLog ? NSLog(__VA_ARGS__) : TRUE))

如果您可以使用宏的结果,那么每次使用宏时都必须进行转换并忽略结果,或者使用警告。在这种情况下,您仍应在宏周围放置括号以避免可能出现的问题。

#define MYSERVERLOG(iLog, ...) (iLog ? NSLog(__VA_ARGS__) : TRUE)

答案 1 :(得分:1)

如果你做了

#define DEBUG 0

或者如果你做了

#define DEBUG 1

“DEBUG”宏定义为......

#ifdef DEBUG 
由于定义了DEBUG,

始终为真。

如果你想进入第二个子句,你必须确保没有定义宏(即删除宏或将其注释掉)。