2009-08-14 4 views
4

Ich deklariere ein Array von NSString * in einer Header-Datei einer Klasse.
PolygonShape.hFehler und Warnungen in Xcode beim Deklarieren von Array von NSString * als globale externe

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

Jetzt habe ich dies in PolyginShape.m bin mit wie folgt:

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

NumberOfSides ist ein iVar, die den Index, bei dem der Polygonnamen gespeichert anzeigt wird
So weit so gut ... es war kompilieren ohne Fehler

Dann habe ich PolygonShape.h in meiner Datei hinzugefügt, die Hauptmethode implementiert (Hinweis: diese hat keine Klassendefinition und Call-Funktionen C-Style eher als obj-c Nun Stil)

#import "PolygonShape.h" 

wenn ich kompilieren, bin ich ein Build (Verlinken) Fehler immer

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 

war Also ging ich durch Stapelüberlauf und anderen Foren und vor allem die Beratung zu machen die globale Variable extern und so habe ich ...

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

jedoch habe ich immer noch die Verknüpfung Störung erhalte und auch 2 Warnungen bekommen nun sagt, dass

warning: 'POLYGON_NAMES' initialized and declared 'extern' 

an beiden Orten, an denen ich PolygonShape.h am Import

Was soll ich hier fehlt?

Danke.

Antwort

9

In Ihrem Header-Datei deklariert das Array als:

extern const NSString* POLYGON_NAMES[]; 

In Ihrer Quelldatei, um das Array definieren und den Inhalt initialisieren:

const NSString* POLYGON_NAMES[] = {@"Invalid Polygon", @"Monogon" }; 
+0

Nun, in diesem Fall wird nicht die "user" von der Klasse nicht bewusst sein, was das Array POLYGON_NAMES [] hält, nur durch Blick auf den Header? Dies soll eine Variable auf Klassenebene (statisch in Java/C++ - Begriffen) sein, also sollte sie nicht für den Benutzer in der Header-Datei selbst verfügbar sein? – Dev

+0

Es gibt keine Möglichkeit, das Array mit seinem Inhalt in der Header-Datei in C/C++/Objective C zu deklarieren. Dmercredi ist korrekt, Sie müssen die Existenz (mit extern) des Arrays in der Header-Datei und das tatsächliche Array deklarieren in der Umsetzung. Andernfalls würde das Array einmal für jedes Mal deklariert werden, wenn der Header enthalten ist (daher der ursprüngliche doppelte Deklarationsfehler, der aufgetreten ist). Wenn Sie "extern" sagen, bedeutet das, dass Sie das Array deklarieren, aber nicht definieren, daher macht es auch keinen Sinn, es zu initialisieren, daher die Warnungen, die Sie bei Ihrem zweiten Versuch erlitten haben. –

+0

Dank dmercredi und Peter – Dev

Verwandte Themen