请查看此 header :
// 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
我有以下问题:
- 声明 (4) 和 (5) 或 (6) 和 (7) 之间是否存在根本区别?
- “外部”声明(4)和包含在实现范围(6)中有什么区别吗?
- 为什么在实现范围内声明的 (6) 和 (7) 可以在另一个实现范围 (9) 中访问?
- 为什么在 header 中声明的 (2) 可以访问在实现范围内声明的 (6)?
- 为什么 (1) 和 (3) 会产生错误
Cannot combining with previous 'extern' declaration specifier
,但 (0) 和 (2) 编译时没有错误?
最佳答案
是的,在此上下文中使用的
static
将变量限制在文件的范围内。如果您有 (4) 并在项目的另一个文件中声明
id A = @"A"
,即使没有在 header 中声明extern
,那么您'会得到一个编译器错误。在 (5) 的情况下,如果您在另一个文件中声明
static id B = @"B"
那么它将正常工作。不,这些是 C 变量声明,不遵循 Objective-C 范围规则。
由于 Objective-C 是 C 的超集,(6) 和 (7) 只是全局变量声明,就像它们在 C 中一样。
(2) 并没有真正引用 (6),它只是向其他文件声明
#import
它“相信我,有一个名为C
的变量> 在另一个文件中声明”,稍后在链接编译的目标文件时解析。如前所述,
static
将变量的范围限制在当前文件中,因此它与extern
冲突,extern
表示变量在另一个文件中声明。
关于objective-c - Objective-C 中的静态变量声明有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11382502/