2012-07-08 12 views
7

このヘッダに見てください: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. エラーが発生する理由Cannot combine with previous 'extern' declaration specifier(0)と(2)はエラーなしでコンパイルされますか?

答えて

7
  1. はい、この文脈で使用staticは、ファイルのスコープに変数を制限します。

    id A = @"A"がプロジェクト内の別のファイルに宣言されている場合は、ヘッダ内にextern宣言がなくても、コンパイラエラーが発生します。

    static id B = @"B"を他のファイルに宣言した場合、(5)の場合、正常に動作します。

  2. いいえ、これらはC変数宣言であり、Objective-Cスコープ規則に従いません。

  3. のObjective-CはCのスーパーセットであるため、(6)、それらはC.

  4. であろうように(7)は、単にグローバル変数は、(6)(2)実際に参照していないと宣言されていますそれは単に#importであることを単に他のファイルに宣言します。「信頼してください。Cという別のファイルで宣言された変数があります。後でコンパイルされたオブジェクトファイルがリンクされたときに解決されます。

  5. 前述のとおり、staticは変数の範囲を現在のファイルに限定しているため、変数が別のファイルで宣言されていることを示すexternと競合します。

+0

あなたは岩です。ありがとう! – Stream

関連する問題