Изменить значения перечисления во время выполнения?

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


person i_raqz    schedule 24.04.2012    source источник


Ответы (2)


К сожалению, @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.

person Richard J. Ross III    schedule 24.04.2012
comment
@ Ричард .. не могли бы вы объяснить, что такое __attribute __ ((конструктор)) .. хотя спасибо за ответ - person i_raqz; 25.04.2012
comment
@learningDroid - это расширение GCC, которое позволяет вам создать функцию, которая вызывается непосредственно перед загрузкой целевого объекта (в dylib это будет до того, как будет запущена первая функция из dylib, в приложении это будет непосредственно перед main()) . Очень полезная конструкция, и до тех пор, пока вы не занимаетесь с ней тяжелой работой, все будет в порядке. - person Richard J. Ross III; 25.04.2012
comment
Я планирую прочитать XML-файл и присвоить значения перечислениям в структуре. Как вы думаете, это будет слишком тяжело в методе __attribute? - person i_raqz; 25.04.2012
comment
@learningDroid нет, если код запускается менее 5 секунд. В этом случае ОС завершит работу приложения. - person Richard J. Ross III; 25.04.2012
comment
@learningDroid stackoverflow.com/questions/2053029/ - person Richard J. Ross III; 25.04.2012
comment
Привет, я попробовал ваше решение, но что-то не работает. Вы можете посмотреть? В .h: i49.tinypic.com/2j5ctxd.png В .m: i48.tinypic.com/p99pf.png - person Luda; 20.02.2013
comment
@Luda Удалите ключевое слово typedef перед ключевым словом struct в вашем .h файле. - person Dinesh Raja; 20.02.2013
comment
@Luda R.A права. Набор маскирует саму структуру, делая значение не устанавливаемым. - person Richard J. Ross III; 20.02.2013
comment
Можно ли в двух словах объяснить, почему все в порядке со struct, а не с enum в объекте-c? - person Luda; 20.02.2013
comment
в качестве последующего вопроса .. возможно ли создать перечисление / структуру, не зная заранее, сколько элементов будет в нем во время выполнения? - person abbood; 14.03.2013
comment
@abbood Ну, вы можете создать карту или что-то подобное, но нет, не с помощью структуры или объединения. Самое близкое, что вы можете найти, - это шаблоны C ++. Структура - это фиксированный макет памяти, а перечисление традиционно представляет собой фиксированный набор значений. - person Richard J. Ross III; 14.03.2013
comment
Это офигенно! Единственная проблема для меня в том, что его невозможно использовать как значение для case из switch (потому что это не постоянное выражение) ... :( - person JP Illanes; 10.04.2015

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

person MByD    schedule 24.04.2012
comment
К сожалению, это так. Однако вы можете использовать структуру вместо перечисления, если хотите хранить информацию. - person Richard J. Ross III; 25.04.2012