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.
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
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. –
Merci dmercredi et Peter – Dev