gpt4 book ai didi

cocoa - 如何使用条件编译的 NSLog 替换来避免 "unused variable"编译器警告?

转载 作者:行者123 更新时间:2023-12-03 16:44:41 24 4
gpt4 key购买 nike

这是我对 NSLog() 的智能变体的搜索的结果。 BetterLog() 的一个关键特性是 NSLog() 替代品在发布和分发版本中编译为空。建议的解决方案(例如 Is it true that one should not use NSLog() on production code? )是定义一个预处理器符号来根据构建类型控制 BetterLog() 的定义。通常:

#ifdef DEBUG_MODE
#define DebugLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
#define DebugLog( s, ... )
#endif

其中 DEBUG_MODE 将被定义为仅用于调试版本的预处理器符号。

但是,在许多情况下,即当使用中间变量构建日志记录语句时,结果是编译器针对未使用的变量发出警告。这是一个例子:

if (error) {
NSString *titleString = @"Error downloading thumbnail, will rebuild it";
NSString *messageString = [error localizedDescription];
NSString *moreString = [error localizedFailureReason] ? [error localizedFailureReason] : NSLocalizedString(@"Check the URL.", nil);
BetterLog(@"%@: %@. %@", titleString, messageString, moreString);
} // silently ignoring *this* error is OK.

这里所有三个字符串都会产生编译器警告。我讨厌编译器警告。

当然,如果不以某种方式有条件地包含变量声明本身,这是不可能避免的。我做了以下尝试,但没有成功:

我不是简单地在 Debug模式下定义 DEBUG_MODE,而是始终定义它,在 Debug模式下使用值 1,在 Release模式下使用值 0。

然后我尝试利用编译器死代码剥离优化:

if (DEBUG_MODE && error) {
// snip
}

代码正常:它在 Release模式下被正确删除。然而编译器仍然发出未使用的变量警告。

所以问题是:有没有可能比丑陋的东西做得更好:

#if DEBUG_MODE
if (error) {
// snip
}
#endif

最佳答案

一种选择是:

#define BetterLog(...) do { (void)(__VA_ARGS__); } while (0)

这样做的好处是,如果您到达 BetterLog(),其参数的任何副作用都会被评估,而且这是一个干净的语句,因此编写 if (x) BetterLog(@"%@", x); 并不是一个错误。 (这会破坏使用宏的下一条语句)。

就我个人而言,我更喜欢使用“丑陋”的预处理器方法,因为它明确排除了调试代码。

关于cocoa - 如何使用条件编译的 NSLog 替换来避免 "unused variable"编译器警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3701582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com