2009-02-16 6 views
17

j'utiliser ce code pour définir mes constantesentier ne constante « pas réduit à un nombre entier »

// Constants.h 
extern NSInteger const KNameIndex; 

// Constants.m 
NSInteger const KNameIndex = 0; 

Et dans une instruction switch dans un fichier qui importe le fichier Constant.h j'ai ceci:

switch (self.sectionFromParentTable) { 
    case KNameIndex: 
     self.types = self.facilityTypes; 
     break; 
    ... 

J'obtiens l'erreur à la compilation qui a lu ceci: « erreur: étiquette de cas ne se réduit pas à un nombre entier constant »

Toutes les idées ce qui pourrait être foiré?

Répondre

-1

Je pense que vous êtes coincé avec l'utilisation d'un const int au lieu d'un const NSInteger car le commutateur fonctionne uniquement avec les types intégrés intégrés. (pas sûr de votre syntaxe avec const retourné après le type).

Jetez un oeil à la question connexe: Objective-C switch using objects?

+1

Notez que NSInteger est défini comme un int [typedef int NSInteger;] peut-être que vous pensez à NSNumber? – epatel

+0

Ah, vous avez raison. Je suis encore loin d'être à l'aise avec Objective-C. – crashmstr

0

Ceci est un coup de poignard dans le noir parce que je ne l'ai pas utilisé Cocoa/ObjC depuis longtemps maintenant, mais est la variable membre sectionFromParentTable pas de type int?

22

Pour C/C++ et Objective-C doit la déclaration de cas ont des valeurs fixes - « réduit à un nombre entier (lire la valeur) » au moment de la compilation

Vos constantes ne sont pas une vraie « constante » parce qu'il est une variable et je pense qu'il peut être changé par un pointeur - à savoir &KNameIndex

Généralement, on définit des constantes comme enum

enum { 
    KNameIndex = 0, 
    kAnotherConstant = 42 
}; 

Si vous souhaitez que nous e C++ ou Objective-C++ (avec .mm comme extension de fichier), vous pouvez utiliser une déclaration const comme

const int KNameIndex = 0; 
+0

L'instruction const est parfaitement légale en Objective-C et parfaitement opérationnelle avec NSInteger. – mouviciel

+0

J'ai testé ici avec un fichier .m minimal et gcc et j'ai le même "label de cas ne réduit pas à une constante entière" pour un "const int kAA = 0;" constante (même avec g ++) – epatel

+0

const int kTest = 0; int main() { int a = 1; switch (a) { case kTest: break; } } compilation sous.m donne >> test1.m: Dans la fonction 'main': test1.m: 8: erreur: l'étiquette de cas ne réduit pas à une constante entière – epatel

1

Je n'ai pas travaillé avec Objective C, mais je vais essayer le montage de la 'extern'. Au moins s'il s'agissait de C++, le fichier Constants.m ne ferait pas partie de l'unité de compilation de Other.m, donc la valeur de KNameIndex serait inconnue du compilateur. Ce qui expliquerait l'erreur; une valeur inconnaissable ne peut pas être une constante.

Est-ce que mettre la définition, pas seulement la déclaration, dans le fichier Constants.h aide?

11

Vous pouvez utiliser

#define KNameIndex 0 

... 

switch (self.sectionFromParentTable) { 
     case KNameIndex: 
       self.types = self.facilityTypes; 
       break; 
     ... 

et cela devrait fonctionner.

Juste eu le même problème et j'ai décidé d'aller aveC#define plutôt qu'enum. Fonctionne pour moi ™ ;-)

Questions connexes