2009-02-16 30 views
17

Puedo usar este código para establecer mis constantesnúmero entero no 'se reduce a un número entero'

// Constants.h 
extern NSInteger const KNameIndex; 

// Constants.m 
NSInteger const KNameIndex = 0; 

Y en una sentencia switch dentro de un archivo que se importa el archivo Constant.h tengo esto:

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

me sale error en tiempo de compilación que decía lo siguiente: "error: etiqueta de la caja no se reduce a una constante entera"

¿Alguna idea de lo que podría ser distraido?

Respuesta

-1

Creo que está atascado con el uso de const int en lugar de const NSInteger, ya que el interruptor solo funciona con tipos integrales incorporados. (no estoy seguro de su sintaxis con const volteado después del tipo).

Tome un vistazo a la pregunta relacionada: Objective-C switch using objects?

+1

Tenga en cuenta que NSInteger se define como int [typedef int NSInteger;] ¿Tal vez está pensando en NSNumber? – epatel

+0

Ah, tienes razón. Todavía estoy muy lejos de ser fluido en Objective-C. – crashmstr

0

Ésta es una puñalada en la oscuridad porque no he utilizado Cacao/ObjC en mucho tiempo, pero es la variable miembro sectionFromParentTable no de tipo int?

22

para C/C++ y Objective-C debe la declaración de caso tienen valores fijos - "reducido a un número entero (leer el valor)" en tiempo de compilación

Sus constantes no es un verdadero "constante" porque es una variable y me imagino que puede ser cambiado a través de un puntero - es decir &KNameIndex

por lo general se define como constantes enum

enum { 
    KNameIndex = 0, 
    kAnotherConstant = 42 
}; 

Si nos haría e C++ o Objective-C++ (con .mm como extensión del archivo) se puede utilizar una sentencia const como

const int KNameIndex = 0; 
+0

La declaración const es perfectamente legal en Objective-C y perfectamente operativa con NSInteger. – mouviciel

+0

Probé aquí con un archivo .m mínimo y gcc y obtengo la misma "etiqueta de caso no se reduce a una constante entera" para un "const int kAA = 0;" constante (incluso con g ++) – epatel

+0

const int kTest = 0; int main() { int a = 1; switch (a) { case kTest: break; } } compilando como.m da >> test1.m: En la función 'main': test1.m: 8: error: la etiqueta del caso no se reduce a una constante entera – epatel

1

no he trabajado con Objective C, pero que iba a tratar de sujeción del 'externo'. Al menos si esto fuera C++, el archivo Constants.m no sería parte de la unidad de compilación de Other.m, por lo que el valor de KNameIndex sería desconocido para el compilador. Lo cual explicaría el error; un valor incognoscible no puede ser una constante.

¿Le sirve la definición, no solo la declaración, en el archivo Constants.h?

11

Puede utilizar

#define KNameIndex 0 

... 

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

y debería funcionar.

Acabo de tener el mismo problema y decidí ir con #define en lugar de enum. Funciona para mí ™ ;-)