我的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中对DEBUG使用“if”而不是“ifdef”,那么它可以正常工作,但随后我的所有MYLOG语句都收到警告,说“未使用结果”。
我如何摆脱这种情况?
最佳答案
我猜您只有在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)
关于iphone - 在PCH文件中定义一个宏,给出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7184271/