6

3 つの個別の .m ファイルの先頭で宣言されている "ID_KEY" という名前の定数がありますが、どちらにも他のファイルは含まれていません。

宣言は次のとおりです。

#import "PublicGamesResponse.h"

NSString *const ID_KEY = @"id";
...
@implementation PublicGamesResponse

他の 2 つのクラスについても同様です。ただし、同じ名前の複数の定義について不平を言うリンカ エラーが発生します (2 つの定義をコメント アウトすると、これはなくなります)。

私の質問は、なぜリンカがこれについて不平を言っているのですか? ID_KEY の各定義は、他のすべての定義の範囲外であるため、リンカが不平を言っている理由がわかりません。

免責事項として、プロジェクトをクリーンアップして xCode を再起動し、サイトで同様の質問を探しましたが、うまくいきませんでした。

4

1 に答える 1

12

関数の外で変数または定数を定義すると、それらはグローバルスコープに配置されます。リンカはグローバル参照を解決し、同じ名前を複数回見つけると文句を言います。

定数にコンパイル単位 (つまり、定義されているファイル) のスコープを与えるにはstatic、定義の前に追加します。

static NSString *const ID_KEY = @"id";

このようにして、同じファイル内のすべての関数とメソッドは にアクセスできますID_KEYが、名前はファイルのスコープに残ります。基本的にstatic、リンカーから名前を「隠します」。

于 2013-03-03T19:48:22.167 に答える