Как последовательно перебрать перечисление? - страница 6

 
pavlick_:

На заметку программистам:


Теперь если нам надо редактировать перечисление, то мы редактируем один раз и в одном месте. Надо добавить новый элемент, например element_new = 56, добавляем

И не паримся о правки функции get_enumqq_array(). Техника называется X Macro https://en.wikipedia.org/wiki/X_Macro. При желании разработчиков, легко можно допилить стандартные перечисления подобным образом.

Может не очевидно сразу, перечисление получилось таким:

Классно! Про X Macro не знал, спасибо! Я вот только по коду не понимаю, почему не возникает ошибки из-за запятой в конце определения ENUM_QQ_HELPER. После последнего элемента при задании enum или array не должно быть запятой. Но компилятор почему-то не не ругается на нее.

Попробовал

int a[] = {1, 2,};

не ругается. И размер массива (enum), как надо. Прикольно! Вроде, и баг, но пусть лучше будет такая багофича. Действительно, с ней удобно.

 
почему не возникает ошибки из-за запятой

Ну это законное нарушение, специально для всяких подобных "штучек", видимо. Не волнуйтесь по этому поводу, это и в C/C++ не ошибка.

ЗЫ: в C++ стандарте на тему инициализации:

braced-init-list:

   {initializer-list , opt}

   { }

Т.е. запятая в конце braced-init-list узаконена на самом высоком уровне.

 
pavlick_:

Т.е. запятая в конце braced-init-list узаконена на самом высоком уровне.

Спасибо, буду знать и использовать.
 
pavlick_:

На заметку программистам:

А как быть с нормальными именами которые в комментах?

 
Комбинатор:

А как быть с нормальными именами которые в комментах?

Можно пример enum-а, о котором идет речь?
 
Комбинатор:

А как быть с нормальными именами которые в комментах?

Да, вставить комментарий не выходит. Неудачный синтаксис для комментирования перечислений.

Можно пример enum-а, о котором идет речь?

enum E
{
   a = 1         // вот этот комментарий
}
 
pavlick_:

Да, вставить комментарий не выходит. Неудачный синтаксис для комментирования перечислений.

Заключайте его в /*...*/.
 
fxsaber:
Заключайте его в /*...*/.
Тут ерунда такая, что препроцессор не хочет кушать комментарии (оба // и /*), не ожидает увидеть их при раскрытии макросов.  Либо изменять правила для препроцессора, либо вводить альтернативный способ комментирования перечислений (комментарий отобразится при запуске скрипта в настройках), например так:

enum E {
   a = 1,            --**--  Комментарий_1
   b = 2            --**--  Комментарий_2
};
Я тут уже бессилен.
 
pavlick_:
Тут ерунда такая, что препроцессор не хочет кушать комментарии (оба // и /*), не ожидает увидеть их при раскрытии макросов.  Либо изменять правила для препроцессора, либо вводить альтернативный способ комментирования перечислений (комментарий отобразится при запуске скрипта в настройках), например так:

enum E {
   a = 1,            --**--  Комментарий_1
   b = 2            --**--  Комментарий_2
};
Я тут уже бессилен.
 

Обработка препроцессором происходит в несколько этапов. Вначале из исходника удаляются все комментарии и этот результат идёт на обработку. И вот там то препроцессор не ожидает встретить комментарий (когда будет раскрывать макросы). Встречу расценивает как ошибку. Например вот:

#define COMMENT / ## /

void OnStart()
{
  COMMENT
}
Безобидный код на первый взгляд, должен вставить комментарий. Но скомпилировать не выйдет.