2009-02-16 14 views
17

Io uso questo codice per impostare le mie costanticostante intera significa 'non riduce in un intero'

// Constants.h 
extern NSInteger const KNameIndex; 

// Constants.m 
NSInteger const KNameIndex = 0; 

E in un'istruzione switch all'interno di un file che importa il file Constant.h ho questo:

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

ottengo l'errore in fase di compilazione che leggere questo: "errore: l'etichetta caso non riduce ad una costante intera"

Tutte le idee che cosa potrebbe essere incasinato?

risposta

-1

Penso che tu sia bloccato con l'utilizzo di uno const int anziché uno const NSInteger poiché lo switch funziona solo con tipi integrati incorporati. (Non sono sicuro della sintassi con const ruotato attorno al tipo).

Date un'occhiata alla relativa domanda: Objective-C switch using objects?

+1

Nota che NSInteger è definito come int [typedef int NSInteger;] forse stai pensando a NSNumber? – epatel

+0

Ah, hai ragione. Sono ancora molto lontano dall'essere fluente in Objective-C. – crashmstr

0

Questo è un salto nel buio perché non ho usato Cocoa/objC in un lungo tempo, ma è la variabile membro sectionFromParentTable non di tipo int?

22

per C/C++ e Objective-C deve l'istruzione case hanno fissato valori - "ridotto a un intero (valore letto)" al momento della compilazione

I suoi costanti non è un vero e proprio "costante", perché è una variabile e immagino che può essere modificato tramite un puntatore - cioè &KNameIndex

di solito si definisce costanti come enum

enum { 
    KNameIndex = 0, 
    kAnotherConstant = 42 
}; 

Se ci farebbe e C++, o Objective-C++ (con .mm come estensione del file) che si potrebbe usare una dichiarazione const come

const int KNameIndex = 0; 
+0

L'istruzione const è perfettamente legale in Objective-C e perfettamente operativa con NSInteger. – mouviciel

+0

Ho provato qui con un file .m minimo e gcc e ottengo la stessa "etichetta del caso non si riduce a una costante intera" per un "const int kAA = 0;" costante (anche con g ++) – epatel

+0

const int kTest = 0; int main() { int a = 1; switch (a) { case kTest: break; } } compilazione come.m dà >> test1.m: nella funzione 'main': test1.m: 8: errore: l'etichetta del caso non si riduce a una costante intera – epatel

1

Non ho lavorato con Objective C, ma mi piacerebbe provare il serraggio 'extern'. Almeno se fosse C++, il file Constants.m non farebbe parte dell'unità di compilazione di Other.m, quindi il valore di KNameIndex sarebbe sconosciuto al compilatore. Quale spiegherebbe l'errore; un valore inconoscibile non può essere una costante.

La definizione, non solo la dichiarazione, nella guida di file Constants.h?

11

È possibile utilizzare

#define KNameIndex 0 

... 

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

e dovrebbe funzionare.

Appena avuto lo stesso problema e ho deciso di andare con #define piuttosto che enum. Funziona per me ™ ;-)

Problemi correlati