4

クラスのヘッダーファイルでNSString*の配列を宣言しています。
PolygonShape.h

NSString* POLYGON_NAMES[] = {@"Invalid Polygon", @"Monogon", ...};

現在、PolyginShape.mでこれを次のように使用しています。

- (NSString*) name {
return (POLYGON_NAMES [self.numberOfSides]);
}

numberOfSidesは、ポリゴン名が格納されているインデックスを示すiVarです
。これまでのところ、エラーなしでコンパイル されていました。

次に、mainメソッドを実装するファイルにPolygonShape.hを追加しました(注:これらには、クラス定義と呼び出し関数obj-cスタイルではなくCスタイル)

#import "PolygonShape.h"

コンパイルすると、ビルド(リンク)エラーが発生します

ld: duplicate symbol _POLYGON_NAMES in /Users/../Projects/CS193P/1B/What_A_Tool/build/What_A_Tool.build/Debug/What_A_Tool.build/Objects-normal/i386/PolygonShape.o and /Users/../Projects/CS193P/1B/What_A_Tool/build/What_A_Tool.build/Debug/What_A_Tool.build/Objects-normal/i386/What_A_Tool.o
collect2: ld returned 1 exit status

だから私はスタックオーバーフローや他のフォーラムを通り抜けました、そしてほとんどのアドバイスはグローバル変数を外部にすることでした、そして私はそうしました...

extern NSString* POLYGON_NAMES[] = {@"Invalid Polygon", @"Monogon" .. };

ただし、リンクエラーが発生し、2つの警告が表示されます。

warning: 'POLYGON_NAMES' initialized and declared 'extern'

PolygonShape.hをインポートしている両方の場所で

ここで何が欠けていますか?

ありがとう。

4

1 に答える 1

9

ヘッダーファイルで、配列を次のように宣言します。

extern const NSString* POLYGON_NAMES[];

ソースファイルで、配列を定義し、内容を初期化します。

const NSString* POLYGON_NAMES[] = {@"Invalid Polygon", @"Monogon" };
于 2009-08-14T05:29:08.077 に答える