2012-08-17 9 views
7
@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の変数を宣言することはできません。なぜこれはそうですか? 「タイプ名でストレージクラスを指定できない」というエラーが表示されるのはなぜですか?タイプ名ではストレージクラスを指定できません

答えて

13

短い説明: クラスの@interface OR @implementationの括弧部分のみ宣言インスタンス変数(別名 "IVAR")のためです。 externキーワードは、グローバル変数宣言(または関数ですが、それは別のトピックです)でのみ使用します。
したがって、extern ivarを宣言することはできません。

グリッティ詳細: 変数は、最初に宣言され、定義されます。明示的な定義のないローカル宣言された変数は、しばしば割り当てられ、コンパイラによってデフォルト値が与えられるため、ローカルスコープの変数の場合、この区別は通常はぼやけます。

グローバル変数は、スコープがグローバルが存在することがわかっている限り、任意のスコープで使用できます。そこにキーワードexternが入ります。にグローバル変数が存在し、と定義されています。これは、異なるコードファイルのグローバル変数にアクセスする場合にのみ便利です。

ベストプラクティス:あなたの本は、実装ファイル内extern変数(例えば「.M」ファイルなど)...それが動作することができますを宣言するいくつかのコードを持っていますが、あなたがしているので、それは悪い習慣ですそのグローバルが他の場所で有効な定義を実際に持っているかどうかについての潜在的に悪い仮定を作成します。

代わりに、ヘッダーファイルにextern変数を一度宣言し、そのヘッダー内のexternを定義するための専用の実装ファイルを用意することがベストプラクティスです。そのグローバル変数を使用する他の実装ファイルにそのヘッダーを含めます。

+0

あなたのお返事ありがとうございますHachiEthan。偶然、私が言及しているこの本は、 '.m'ファイルに 'extern'を使っています。 –

+0

@Rut私は前にexternの素敵なものを掘り下げていないので、少し研究をしています! (それは私の現在の仕事で私を助けるでしょう)すぐに答えを更新します。 =) – MechEthan

+0

本当にありがとうございます! –

関連する問題