7

externヘッダーファイルの変数宣言の前に単語を配置すると、初期化せずにグローバル静的変数の存在が宣言されることを理解しています。externまた、変数を含むファイルをインポートすると、クラス/ファイル名なしでそれらを参照できることも理解しています。しかし、それらとそれらの値をどこで定義するのでしょうか?

私がやろうとしているのは、iOSアプリケーションのコード全体で使用したいグローバル定数を使用して定数のクラスを作成することです。

このようにインターフェース内に配置しますか?

Example.h

#import <Foundation/Foundation.h>
@interface Constraints : NSObject
{

extern   NSString * const PREFS_NAME;

}

または、このようにインターフェイスの外に配置しますか

Example.h

#import <Foundation/Foundation.h>

extern   NSString * const PREFS_NAME;    

@interface Constraints : NSObject
{

}

次に、実装.mファイルで、extern値をどのように初期化しますか?

このような実装領域内?

Example.m

#import "Constraints.h"

@implementation Constraints

/**PRefecences name for the application**/
const  NSString * PREFS_NAME = @"MyApp_Prefs";

@end

または、次のように実装領域の外で初期化します。

Example.m

#import "Constraints.h"

/**PRefecences name for the application**/
const  NSString * PREFS_NAME = @"MyApp_Prefs";

@implementation Constraints

@end

または、コンストラクターで初期値を提供しますか?+または、その前に任意の静的スタイルメソッドがあり+(void) setAppConstraintsます。

いくつかの組み合わせを試しましたが、「異なるタイプの「xVariable」の再定義」などのエラーが常に発生します。または、「externには初期化インターフェースがありません」(またはそのようなもの、私は忘れています)についての何か。public static finalしたがって、Javaの変数と同じ役割を形成するために、それらを適切にデクレアおよび初期化する方法を知りたいと思います。

externまた、コマンドの制限は何ですか?私はまたはができることを知っていますがextern、どうですか?NSIntegerNSStringNSArray

externObjective-Cでの使用に関する多くの誤解を招く、または不完全な情報があるように思われるため、この質問をしています。答えの多くは推測のようです。私の希望は、この質問が私にとってだけでなく、の基本についての同様の質問をさらに制限するための良いリソースになることですextern

4

2 に答える 2

13

宣言されているファイル(この場合はExample.m)で値を定義します。この変数は引き続き再割り当てできるため、Example.hの宣言は次のようになります。

extern  NSString * PREFS_NAME;

このようにして、Example.hをインポートするすべてのファイルがこの変数にアクセスできます。Objective-Cのpublicstaticfinalに相当するのはconstです。また、パブリックにしたい場合は、クラスインスタンス変数にする必要がありますが、この場合は、どこからでもアクセスできるため、必要ありません。したがって、この場合は次のようになります。

// .m file
NSString* const PREFS_NAME = @"MyApp_Prefs";
// .h file
extern NSString* const PREFS_NAME;

また、constNSString*はNSString*constとは異なることに注意してください。後者はNSStringへのconstポインタです。前者は、正しい構文であっても意味がありません。Objective-Cでは、const修飾子はオブジェクトに影響を与えませんが、代わりに可変クラスと不変クラスがあります。C ++では、インスタンスでconstメソッドだけを使用できるという意味があります。

于 2013-02-16T19:53:11.823 に答える
3

extern別のコンパイル単位で定義されている変数または関数を使用することをコンパイラーに通知するために使用されます。

と言うときはextern const NSString *PREFS_NAME、「このコンパイルユニット内のPREFS_NAMEへのすべての参照を、別のファイルで定義されている変数PREFS_NAMEに置き換えてください」と言っています。したがって、.mでPREFS_NAMEを割り当てようとすると、名前はあるものの存在しない変数を割り当てるだけです。変数externの宣言は、変数または関数の宣言にすぎず、その変数または関数の定義ではありません。これにより、名前が使用中であり、リンカーがその名前の処理を処理することがコンパイラーに通知されますが、ここで型を指定しても、実際には変数用のスペースが確保されないため、実際に変数を定義しているコンパイル単位に確保するスペース。

3つまたは4つの異なるソースコードファイルを一緒にコンパイルします。そのうちの3つは次のように宣言できます。

extern int buffer[];

そして、宣言することができます

int buffer[BUFSIZE];

そのグローバルスコープでは、リンカの仕事はextern buffer、バッファの4番目の実際の定義への3つの宣言された参照を解決することです。

externこれは、Objective-Cクラスと同じように、C変数と関数@classに対するものであり、前方宣言であり、ここで定義されていない名前が表示されたときに、リンカーが長引くものに応答するため、気を狂わせる必要がないことをコンパイラーに約束します。あなたが持っているかもしれない質問。

于 2013-02-16T19:17:09.797 に答える