7
@interface Foo : NSObject

{
    extern int gGlobalVar;   
    int i;
}
-(void)setgGlobalVar:(int)val;

@end


@implementation Foo

-(void)setgGlobalVar:(int)val
{  
    i = 5;
    NSLog(@"i = %i", i);
    gGlobalVar = val;
}

@end

我可以i在接口中声明并在实现中使用它而不会出现任何错误。但是我不能extern在接口中声明类型的变量。为什么会这样?为什么我会收到一条错误消息:“类型名称不允许指定存储类”?

4

1 回答 1

13

简短描述:@interface类OR 的括号部分@implementation仅用于声明实例变量(又名“ivar”)。该extern关键字仅用于全局变量声明(或函数,但这是另一个主题)。
因此,您不能声明 extern ivar。

细节细节: 变量首先被声明,然后被定义。对于局部范围内的变量,这种区别通常是模糊的,因为没有显式定义的局部声明变量通常会被编译器分配并赋予默认值。

全局变量可能在任何范围内可用,前提是该范围知道全局存在。这就是关键字extern出现的地方——它声明全局变量存在,并在其他地方定义。这仅在您想要访问不同代码文件中的全局变量时才有用。

最佳实践:您的书中有一些代码在实现文件(例如“.m”文件等)中声明了一个extern变量......这可以工作,但这是一种不好的做法,因为您对是否存在潜在的错误假设global 实际上在其他地方有一个有效的定义。(但是,花哨的编译器会发现这种类型的错误。)

相反,最佳实践是在头文件中声明一次外部变量,附带一个专用于在该头文件中定义外部变量的实现文件,然后将该头文件包含在其他想要使用该全局变量的实现文件中。

于 2012-08-17T16:53:07.330 回答