2012-04-24 18 views
6

¿Hay alguna forma de asignar valores a enumeraciones durante el tiempo de ejecución en el objetivo c? Tengo varias enumeraciones y quiero que cada enum tenga cierto valor. Los valores se pueden leer desde un archivo xml. ¿Hay alguna forma de hacer esto?¿Cambia los valores enum en el tiempo de ejecución?

Respuesta

16

Desafortunadamente, @Binyamin es correcta, no se puede hacer esto con una enumeración. Por esta razón, por lo general lo siguiente en mis proyectos:

// in .h 
typedef int MyEnum; 

struct { 
    MyEnum value1; 
    MyEnum value2; 
    MyEnum value3; 
} MyEnumValues; 

// in .m 
__attribute__((constructor)) 
static void initMyEnum() 
{ 
    MyEnumValues.value1 = 10; 
    MyEnumValues.value2 = 75; 
    MyEnumValues.value3 = 46; 
} 

Esto también tiene la ventaja de ser capaz de recorrer los valores, lo cual no es posible con una enumeración normales:

int count = sizeof(MyEnumValues)/sizeof(MyEnum); 
MyEnum *values = (MyEnum *) &MyEnumValues; 

for (int i = 0; i < count; i++) 
{ 
    printf("Value %i is: %i\n", i, values[i]); 
} 

Con todo, esta es mi forma preferida de hacer enumeraciones en C.

+0

@ Richard ... podría explicar qué es el __tribuidor __ ((constructor)) .. gracias por la respuesta –

+1

@learningDroid es una La extensión GCC, que le permite crear una función que se llama justo antes de que se cargue el objetivo (en un dylib, sería antes de que se ejecute la primera función desde el dylib, en una aplicación, justo antes de 'main()') . Una construcción muy útil, y mientras no hagas ningún trabajo pesado en ella, estarás bien. –

+0

Estoy planeando leer un archivo xml y asignar valores a las enumeraciones en una estructura. ¿Cree que esto será demasiado pesado en el método de atributo __ –

5

No, la información de enumeraciones se borra en el momento de la compilación.

+4

Lamentablemente este es el caso. Sin embargo, puede usar una estructura en lugar de una enumeración si desea mantener la información. –

Cuestiones relacionadas