2009-08-14 2 views
4

Je déclare un tableau de NSString * dans un fichier d'en-tête d'une classe.
PolygonShape.hErreur et avertissements dans Xcode lors de la déclaration d'un tableau de NSString * en tant qu'ext extern

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

Maintenant, je me sers de ce en PolyginShape.m comme suit:

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

numberOfSides est un iVar qui indiquera l'indice auquel le nom du polygone est stocké
donc loin si bon ... il compilait sans aucune erreur

Puis j'ai ajouté PolygonShape.h dans mon fichier qui implémente la méthode principale (note: ceux-ci n'ont pas de définition de classe et les fonctions d'appel C-Style plutôt que obj-c style)

#import "PolygonShape.h" 

Maintenant, quand je décompiler, je reçois une construction (lien) Erreur

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 

Je suis passé par débordement de pile et d'autres forums et surtout les conseils était de faire la extern variable globale et donc je l'ai fait ...

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

Cependant, je reçois toujours l'erreur de liaison et également obtenir 2 avertissements maintenant que dit

warning: 'POLYGON_NAMES' initialized and declared 'extern' 

aux deux endroits où j'importe PolygonShape.h

Qu'est-ce que je manque ici?

Merci.

Répondre

9

Dans votre fichier d'en-tête déclarer le tableau comme:

extern const NSString* POLYGON_NAMES[]; 

Dans votre fichier source, définir le tableau et initialiser le contenu:

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

Eh bien, dans ce cas wont le « utilisateur » du classe ne pas savoir ce que le tableau POLYGON_NAMES [] tient juste en regardant l'en-tête? Ceci est supposé être une variable de niveau classe (termes statiques Java/C++), donc ne devrait-elle pas être disponible pour l'utilisateur dans le fichier d'en-tête lui-même? – Dev

+0

Il est impossible de déclarer le tableau avec son contenu dans le fichier d'en-tête C/C++/Objective C. dmercredi est correct, vous devez déclarer l'existance (avec extern) du tableau dans le fichier d'en-tête et le tableau réel dans la mise en œuvre. Sinon, le tableau serait déclaré une fois pour chaque fois que l'en-tête est inclus (d'où l'erreur de déclaration en double originale que vous avez subie). Dire "extern" signifie que vous déclarez, mais ne définissez pas, le tableau, donc cela n'a aucun sens de l'initialiser aussi, d'où les avertissements que vous avez subis dans votre deuxième tentative. –

+0

Merci dmercredi et Peter – Dev

Questions connexes