ChatGPT解决这个技术问题 Extra ChatGPT

如何摆脱 Xcode 中的“未使用变量”警告?

我完全理解为什么会出现未使用的变量警告。我不想一般地压制它们,因为它们在大多数情况下都非常有用。但是,请考虑以下(人为的)代码。

NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);

Xcode 报告 saved 是一个未使用的变量,当然它不是。我怀疑这是因为 NSAssert1 是一个宏。 NS_BLOCK_ASSERTIONS 宏未定义,因此肯定启用了 Objective C 断言。

虽然它不会伤害任何东西,但我觉得它不整洁和烦人,我想压制它,但我不知道该怎么做。将变量分配给自身可以消除编译器警告,但如果存在这种情况,我宁愿以“正确”的方式进行操作。


E
Evan Mulawski

我不确定新的 LLVM 编译器是否仍支持它,但 GCC 有一个“未使用”属性,您可以使用它来抑制该警告:

BOOL saved __attribute__((unused)) = [moc save:&error];

或者(如果 LLVM 不支持上述内容),您可以将变量声明拆分为单独的行,以保证无论宏是否扩展,该变量都将被“使用”:

BOOL saved = NO;
saved = [moc save:&error];

J
JOM

使用 Xcode 4.3.2 发现这似乎可行(少写)

BOOL saved __unused;

这对我不起作用,我收到警告 'saved' was marked as unused but was used
B
Black Frog

在 Xcode 中,您可以为“未使用的变量”设置警告。转到目标的“构建设置”并使用“未使用”一词进行过滤

https://i.stack.imgur.com/IgwFn.png

我建议您仅将其更改为 Debug。这样您就不会错过发布版本中的任何内容。


您是否错过了问题中 Gregory 所说的“我一般不想压制它们,因为它们在大多数情况下非常有用”的部分?
@ShermPendley 无论如何,这仍然很有用,它回答了我关于如何在全球范围内关闭它的问题。
关闭警告是错过错误的好方法。我强烈反对。
@orionelenzil - 好吧,是的,不是的。存在误报的真正接口问题。如果您没有到达使用变量的代码部分,则在您编写代码时会不断弹出警告。随着时间的推移,这将训练您忽略警告,这意味着您很可能会错过更重要的错误。最好能够抑制正在积极编辑的代码块中的错误。
嗨,如果我设置为 NO,它工作正常。但我的疑问是:我必须设置 Debug & Release NO ya only Unused Variable: NO?我必须设置哪一个。如果我设置为完全否,那么它在发布期间不会产生任何问题吗?
D
Danny Xu
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

像这样试试。它对我有用。它也对你有用。


这对我不起作用,我收到警告 'saved' was marked as unused but was used
u
user3125367

将变量标记为已使用的唯一简单且可移植的方法是……使用它。

BOOL saved = ...;
(void)saved; // now used

不过,您可能会对已经描述的特定于编译器的扩展感到满意。


我更喜欢上面描述的丑陋的#pragma。
嘿兄弟,不错的提示
A
Alex
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

SOURCE


这是最干净的方法,因为它只禁用那些#pragmas 之间的警告
J
João Nunes

尝试:__unused 属性。在 Xcode 5 中工作


T
Trenskow

这是您在 C 中执行此操作的方式,因此也是 Objective-C 中的方式。

即使您没有启用警告,将返回值标记为显式忽略总是一个好主意。它还向其他开发人员表明,您不仅忘记了返回值——您确实明确选择忽略它。

(void)[moc save:&error];

编辑:编译器忽略对 void 的强制转换,所以它不应该影响性能——它只是一个很好的干净的人工注释。


在某些情况下,您必须使用此 hack 来编译 Objective-C 代码。使用 (void) 是最清晰的方法,谢谢!
A
ArNo

https://i.stack.imgur.com/pCoZv.png


0
0xFADE

让它占据两行。分离声明和默认值

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;