如何禁用“本地声明'foo'隐藏实例变量”警告?

时间:2011-06-10 19:22:06

标签: xcode llvm

我明白警告说的是什么。这正是范围规则的工作原理。我很欣赏有些人想要一个保姆。我不。如何禁用此警告?

5 个答案:

答案 0 :(得分:6)

您无法在当前版本的XCode中禁用此警告。它没有构建设置,也没有警告ID,您可以使用它将标志传递给编译器以告诉它退出抱怨。

为了将来参考,您可以通过转到Log Navigator找到该警告ID,单击出现警告的最新版本,深入查看日志以找到“编译”任务显示的位置感叹号并单击“更多详细信息”按钮,该按钮看起来像一个带有5条水平线的灰色标注。您将看到详细列出的警告/错误,如果有警告ID,它将显示在详细说明黄色警告的行上。至少,这就是我在Apple的一位编译工程师所说的话。我还没有看到一个警告,我实际上要禁用日志中出现ID。

向Apple提交bugreport,告诉他们您需要更多选项来禁用XCode中的警告并专门列出这个警告。

答案 1 :(得分:6)

在Xcode 4.4中,可以通过转到构建设置“Other Warning Flags”并设置值“-Wno-shadow-ivar”来禁用它。

答案 2 :(得分:5)

您正在寻找的警告名称是“shadow-ivar”。它在Xcode 4.3的日志中显示为warning: local declaration of 'foo' hides instance variable [-Wshadow-ivar]

我仍然没有在项目的Build Settings列表中看到它,但是#pragma clang diagnostic ignored "-Wshadow-ivar"将一次在一个文件中处理它。我实际上想为特定功能关闭它然后再打开它。就这样,在我决定不关心的地方,我不再唠叨我,但会在新的代码中再次警告我。

答案 3 :(得分:3)

NSString *foo;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow-ivar"

- (void)myFunctionWithShadow_ivarWarningsIgnored {

    NSString *foo = @"...";
    NSLog(@"This shouldn't get a warning %@", foo);

}

#pragma clang diagnostic pop

- (void)myFunctionWithShadow_ivarWarningsNotIgnored {

    NSString *foo = @"...";
    NSLog(@"and this should %@", foo);

}
祝你好运! :)

答案 4 :(得分:1)

Xcode 8.3的更新 - 编译器产生的错误"声明阴影局部变量"在某些情况下,当它故意......和保姆恐慌。

例如,在目标C中:

鉴于

typedef BOOL ( ^BoolBoolBlock ) ( BOOL );

Apple Blocks的性质将使直接外部范围内的任何变量声明为块,块为全局(伪全局)。这会导致BOOL theResult = false;行上的警告(以及设置中警告==错误的错误):

- (BoolBoolBlock) boolBoolBlock {
    BoolBoolBlock    theResult = nil;

    theResult = ^BOOL ( unused BOOL is ) {
        BOOL    theResult = false; // hides (shadows) the outer theResult (a good thing)

        /*
         call back code goes here,
         all variables local in scope to this method are global to the block so be careful
         */
        return theResult;
    };

    return theResult;
}

保姆看到BoolBoolBlock theResult = nil;BOOL theResult = false;遮挡阴影,这实际上是故意的,原因有两个:

  1. 按照约定在我的代码中,所有返回值都是theResult,无论是什么
  2. 是一个积极的副作用,因为我在道德上反对全局。
  3. 换句话说,整个构造被设置为阻止Apple块的伪全局机制并将结构置于混乱之上。阻止方法" theResult"从方法返回的块中使用是一个好东西 ...但是保姆有一个合适的东西。

    要让保姆冷静下来(如果您有将警告设置为错误的规则,请排除警告或可能出现错误),您只需在项目文件中更改此设置 - >构建设置 - >过滤"其他" - >隐藏的局部变量 - >换到"否" ......或视觉上:

    screen shot of Xcode Build Settings showing Hidden Local Variables set to "No"