2012-04-24 4 views
6

Есть ли способ присвоить значения для перечислений во время выполнения в объекте c? У меня есть несколько перечислений и хочу, чтобы каждый из перечислений имел определенное значение. Значения могут быть прочитаны из XML-файла. Есть ли способ сделать это?Изменить значения переполнения во время выполнения?

ответ

16

Unfortunatley, @Binyamin правильно, вы не можете сделать это с помощью перечисления. По этой причине, я обычно делаю следующее в моих проектах:

// 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; 
} 

Это также имеет преимущество возможности перебирать значения, которые не возможно с нормальным перечислимого:

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]); 
} 

В общем, это мой предпочтительный способ сделать перечисления в C.

+0

@ Richard .. Не могли бы вы объяснить, что такое __ атрибут __ ((конструктор)) .. спасибо за ответ, хотя –

+1

@learningDroid это Расширение GCC, которое позволяет вам создать функцию, которая вызывается непосредственно перед загрузкой цели (в dylib она должна быть до запуска первой функции из dylib в приложении, она находится непосредственно перед 'main()') , Очень полезная конструкция, и пока вы не делаете тяжелой работы, вы должны быть в порядке. –

+0

Я планирую прочитать xml-файл и присвоить значения перечислениям в структуре. Считаете ли вы, что это слишком тяжело в методе __attribute –

5

Нет, информация перечислений удаляется во время компиляции.

+4

К сожалению, это так. Однако вы можете использовать struct вместо enum, если вы хотите сохранить информацию. –

Смежные вопросы