Правильный способ объявления «не установленного» значения перечисления

#c #enums #initialization

#c #перечисления #инициализация

Вопрос:

При использовании перечисления, для которого вы не можете изменить содержимое, например,

 typedef enum {
  sun=0,
  mon=1,
  tue=2,
  wed=3,
  thu=4,
  fri=5,
  sat=6,
} days;
  

Есть ли какой-либо способ безопасно иметь некоторый код, который выглядит как:

 days day;

day = /*what goes here*/;

if (somecondition)
{
  day = sun;
}
else if (othercondition)
{
  day = mon;
}

if (day != /*what goes here*/)
{
  use(day);
}
  

Помимо создания другого часового, который показывает, что был установлен день, и не полагаясь на знание содержимого перечисления дней?

Ответ №1:

В аналогичном кодировании я пытаюсь зарезервировать первое перечисление (0) в качестве значения «NULL»:

 typedef enum { 
  nullday = 0,
  sun=1,
  mon=2,
  tue=3,
  wed=4,
  thu=5,
  fri=6, 
  sat=7,
} days;
  

Это позволяет использовать «не дневной» день:

 days day;

day = nullday;

if (somecondition)
{
  day = sun;
}
else if (othercondition)
{
  day = mon;
}

if (day != nullday)
{
  use(day);
}
  

Другая версия кода:

 typedef enum {nullday=0, sun, mon,tue,wed,thu,fri,sat} days;

...

days day = nullday;

if (somecondition)
{
  day = sun;
}
else if (othercondition)
{
  day = mon;
}

if (day)
{
  use(day);
}
  

Комментарии:

1. Я бы начал с -1 » неопределенного дня «. Остерегайтесь, что программисты начинают считать 0 . 😉