类型名称不允许指定存储类

时间:2012-08-17 16:49:16

标签: objective-c extern

@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的变量。为什么会这样?为什么我会收到一个错误:“类型名称不允许指定存储类”?

1 个答案:

答案 0 :(得分:13)

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

Gritty Details: 首先声明变量,然后定义变量。对于局部作用域中的变量,这种区别通常是模糊的,因为没有显式定义的本地声明的变量通常会被编译器分配并给出一个默认值。

如果范围知道全局存在,则全局变量可能在任何范围内可用。这就是关键字extern的用武之地 - 它声明全局变量存在,并在其他位置定义。这仅在您想要访问不同代码文件中的全局变量时才有用。

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

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