2010-12-19 2 views
10

"extern"を使ってObjective-Cでグローバル変数を定義できますが、私が宣言した変数は私の最初の方法が誤ってグローバルになっていた(そしてそれがいくつかの問題を引き起こしていた)前に、私の.mファイルの上に。ヘッダファイルの@interface部分にそれらを移動しました。私は、クラス内に存在するものとして正しく宣言していると思いますが、私の問題のいくつかを解決しましたが、まだ少し混乱しています。Objective-Cのグローバル変数 - .mファイル宣言のexternとtopの違い

変数をexternとして宣言し、それを.mファイルの先頭に置くことの違いは何ですか?それとも、同じことでそれらの結果を行うのですか?

答えて

25

にexternはあなただけがこここの変数を宣言し、実際にそれがは別の場所でを定義することが期待されていることを、読みやすさとコンパイル時に実施するために、明示的に述べるの方法です。 extern変数を定義しようとすると、コンパイラはあなたの方法のエラーを教えてくれます。これは、グローバル変数が名前の衝突や複数の定義を防ぐのに便利です。両方ともリンカーエラーが発生します。ただし、externキーワード自体は変数をグローバルにしません。

グローバル変数をファイル内の宣言の位置にするのは何ですか?クラスのヘッダーファイルの@interfaceの外に変数を宣言する場合は、クラスのすべてのインスタンスとヘッダーを#importするすべてのインスタンスで共有される変数を宣言する必要があります。あなたのクラスの.mファイルの@implementationの外に変数を宣言する(そして明らかにした)場合は、クラスのすべてのインスタンス間で共有される変数を宣言していますが、誰にも見えません#imports you header。

したがって、変数の宣言の位置を使用してスコープを決定します。 は、のグローバル変数を1か所に定義します。 と宣言している他のすべての場所については、コードを読みやすくするためにexternを宣言の前に付け、意図を明確にし、再度定義しないようにしてください。

+11

ショートバージョン:externは、どこかに存在しますが、ここには存在しないことを意味します。 @interfaceまたは@implementationの中にそれを持たないことは、それをグローバルにします。 – ughoavgfhw

+0

すばらしい説明、ありがとう。 –

+0

ご協力いただきありがとうございます! – Jackson

関連する問題