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