请查看此标题:
// Test.h
@interface Test : NSObject @end
extern id A; // (0)
//extern static id B; // (1) Uncomment to get a compiling error
extern id C; // (2)
//extern static id D; // (3) Uncomment to get a compiling error
进入这个实现:
// Test.m
#import "Test.h"
id A = @"A"; // (4)
static id B = @"B"; // (5)
@implementation Test
id C = @"C"; // (6)
static id D = @"D"; // (7)
@end
// Still Test.m
@interface Test2 : NSObject @end
@implementation Test2 : NSObject
+ (void)initialize {
NSLog(@"%@ %@", A, B); // (8)
NSLog(@"%@ %@", C, D); // (9)
}
@end
我有以下问题:
Cannot combine with previous 'extern' declaration specifier
,但编译(0)和(2)没有错误?答案 0 :(得分:7)
是的,此上下文中使用的static
将变量限制为文件的范围。
如果你有(4)并在项目的另一个文件中声明id A = @"A"
,即使标题中没有extern
声明,你也会遇到编译错误。
在(5)的情况下,如果您在其他文件中声明static id B = @"B"
,那么它将正常工作。
不,这些是C变量声明,不遵循Objective-C范围规则。
由于Objective-C是C的超集,(6)和(7)只是声明的全局变量,就像它们在C中一样。
(2)没有真正引用(6),它只是向其他文件声明#import
它“信任我,在另一个文件中声明了一个名为C
的变量”,稍后在编译的目标文件链接时解析。
如前所述static
将变量的范围限制为当前文件,因此它与extern
冲突,后者表示变量在另一个文件中声明。