我的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语句中收到警告,说“未使用表达结果”。
我怎样摆脱这种情况?
答案 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,始终为真。
如果你想进入第二个子句,你必须确保没有定义宏(即删除宏或将其注释掉)。