Для обеспечения безопасности типов с перечислениями в C проблематично, поскольку они по существу являются целыми числами. И константы перечисления на самом деле определены стандартом типа int
.
Чтобы достичь некоторой степени безопасности, я делаю трюки с указателями, как это:
typedef enum
{
BLUE,
RED
} color_t;
void color_assign (color_t* var, color_t val)
{
*var = val;
}
Поскольку указатели имеют более строгие правила типа, чем значения, поэтому это предотвращает такой код:
int x;
color_assign(&x, BLUE); // compiler error
Но это не предотвращает такой код:
color_t color;
color_assign(&color, 123); // garbage value
Это связано с тем, что константа перечисления по существу является просто int
и может быть неявно назначена переменной перечисления.
Есть ли способ написать такую функцию или макрос color_assign
, который может обеспечить полную безопасность типа даже для констант перечисления?