Чем отличаются объявления статических переменных в Objective -C?

Пожалуйста, просмотрите этот заголовок:

// 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

У меня есть следующие вопросы:

  1. Есть ли принципиальная разница между объявлениями (4 )и (5 )или (6 )и (7 )?
  2. Есть ли разница между «внешним» объявлением (4 )и вложенным в область реализации (6 )?
  3. Почему (6 )и (7 ), объявленные в области реализации, могут быть доступны в другой области реализации (9 )?
  4. Почему (2 ), объявленные в заголовке, могут получить доступ к (6 ), объявленным в рамках реализации?
  5. Почему (1 )и (3 )выдают ошибки Cannot combine with previous 'extern' declaration specifier, а (0 )и (2 )компилируются без ошибок?
7
задан Vadim 8 July 2012 в 10:57
поделиться