Использование директивы #define для обозначения элементов case в конструкции switch

Здравствуйте. Можно ли использовать директивы #define для обозначения элементов case в конструкции switch?

#define SETUP_SEARCH 0
#define SETUP_WAITING 1
#define SETUP_NET_FOUND 2
#define SETUP_NET_NOT_FOUND 3

enum {
  SEARCH,
  WAITING,
  NET_FOUND,
  NET_NOT_FOUND,
} modem_setup_step;

  switch (modem_setup_step) {

    case SETUP_SEARCH:
      modem_setup_step = WAITING;
      break;

    case SETUP_WAITING:
      modem_setup_step = SEARCH;
      break;
  }

В вашем коде дефайны вообще не нужны, по умолчанию элементы enum и так нумеруются с нуля. Что мешает именно их и использовать в свитч-кейсе?

enum {
  SEARCH,
  WAITING,
  NET_FOUND,
  NET_NOT_FOUND,
} modem_setup_step;

  switch (modem_setup_step) {

    case SEARCH:
      modem_setup_step = WAITING;
      break;

    case WAITING:
      modem_setup_step = SEARCH;
      break;
  }
1 лайк

Зачастую и switch/case (с define или enum) не очень красивы. Ведь эти define/enum нужно придумывать, давать им осмысленные названия… Вместо этого их посыпают сахаром для удобства и наглядности.

1 лайк

Спасибо

Всегда case’ы маркирую enum’ом.
define там как бы не нужен.

Для вашего случая, я пишу примерно так:

pt_begin();
bla-bla-bla1();
pt_next;

bla-bla-bla2();
pt_next;

bla-bla-bla3();
pt_end();

и ни о чём не думаю.

Не вижу полной альтернативы switch - case. Может объясните поподробней?

Зачем полной? Достаточно для данного случая:

#define pt_begin()      static uint16_t pt;  switch (pt) { case 0:
#define pt_next()       pt = __LINE__; break; case __LINE__:
#define pt_end()        pt = 0; }

Этак можно и до бейсиковской нумерации строк можно дойти…

Да пофигу. Лишь бы удобно было, разве нет? А это прокатывает везде! И плюсов никаких не надо.

ИМХО, дело привычки, но с читаемостью кмк беда.
Скорость работы не увеличивается, код тоже не сокращается, а если кому придется разобраться с исходником, нужно будет потратить время на вникание в конструкцию.

3 лайка

Да вот, как раз, всё и сводится к пониманию. Неужто switch/case и с этим мусором будет понятнее? В том то и дело. Или “мы по разному видим мир?”

Да. Мне например тоже проще и понятнее switch case, чем копаться по исходникам, выискивать какие то define

1 лайк

Вот. Это как раз и объясняет уровень.Либо ты копошишься в говне, либо разбираешься с логикой.

Да, говно в вашем вышеприведенном коде знатное.

Офигеть! Ну вы бы обосновали своё утверждение чем то. Или просто так, тяп, ляп.)
Ведь понятно, что высокоуровневый язык позволяет легче выражать свою логику, не вникая в физику. Иначе зачем он нужен - ведь есть низкоуровневый ассемблер.

О…смотрю вежливость пошла)
А теперь перечитайте свой ответ по поводу кода и умений других людей, и подумайте, реально ли вы спец, или так…попи…ть пришли)

А в чём не вежливость? Другое дело, что своё считаем за правильное в первой инстанции - это да. Тут нас, конечно, не перешибёшь. Так держать!

Федя, родной! Мне - не очень нравится. В коммерческом коде вообще недопустимо. Нельзя создавать и использовать макросы, которые скрытым образом изменяют структуру кода.
Но изящество есть, для личного применения. И тут самое важное замечание будет:
Эти ухищрения нужны ИСКЛЮЧИТЕЛЬНО в примитивных контроллерах. Где используется парадигма сетап-луп. Как только у меня есть треды, я просто в отдельном треде спокойно пишу код с делееями, забыв про все танцы “в мешке”.

Ты заметь - я не ругаю. Но это не читаемо. Как и любое сильно вычурное программирование.
Я бы писал свич явно, с логичными кейсами, если бы нуждался в чем-то подобном. Но лучше штоп фриРТОС была! ;)))))
Тут дело вкуса. Мне никогда не были приятны 8-ми битники. Но кто-то любит именно на Тиньке решить задачу, для которой я возьму СТМ32. Я не знаю - зачем, но кто-то любит и я их судить не стану. Но и понять не смогу.

Даже на тиньках я использую enum class. С глобалами оно не пересекается, выдумывать уникальное не надо. Длинное написание с лихвой компенсируется работающим intellicense. Зато читается и через три года.