1

我的 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 语句中都会收到警告,说“未使用表达结果”。

我怎样才能摆脱这种情况?

4

2 回答 2

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)
于 2011-08-25T02:05:23.533 回答
1

如果你做一个

#define DEBUG 0

或者如果你做一个

#define DEBUG 1

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

#ifdef DEBUG 

由于定义了 DEBUG,因此将始终为真。

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

于 2011-08-25T02:00:42.627 回答