C предупреждение : перечисляемый тип смешивается с другим типом

#c #gcc #warnings #coverity

Вопрос:

У меня есть перечисление, определенное следующим образом —

 typedef enum  {  emp1 = 0u,  emp2,  emp3 }employid;  

C выдает мне предупреждения для следующих операций

Проблема 1:

 unsigned int var; // 32 bit in my compiler  typedef struct {  employid e; }mystruct;  mystruct s; s.e = var; // **getting warning enumerated type mixed with another type**  

Проблема 2:

 somefun(var); // **getting warning enumerated type mixed with another type**  function definition is somefun(employ e);  

Я не понимаю, что, хотя мои значения перечисления положительны, так как 1-й элемент равен 0u, почему компилятор C кричит на меня за то, что я назначил его беззнаковому int ?

Пожалуйста , не бросайте еще одну ссылку SO, я просмотрел 100 вопросов SO, прежде чем опубликовать это !

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

1. Поскольку вы определили e как employe, вы не можете назначить его беззнаковому int

2. В любом случае нет никакой гарантии, что var это одно из значений перечисления.

3. @RetiredNinja это правда, что мы можем сделать, чтобы подавить предупреждение ? Я не хочу добавлять проверки диапазона

4. @RetiredNinja какая-нибудь помощь ?

5. Приведение его может помочь с предупреждением. Однако это не улучшит использование недопустимых значений.

Ответ №1:

Ваш код хорош в том, что касается правил языка Си. Это просто дополнительная диагностика, которая говорит вам, что код подозрительный.

An unsigned int может содержать значения, не соответствующие какой-либо допустимой константе перечисления, и в этом случае вы получите s.e недопустимое значение. То есть: в большинстве случаев на самом деле нет никакого смысла смешивать простые целые числа с перечислениями. Если вы обнаружите, что делаете это, то основная проблема, скорее всего, находится на уровне разработки программы.

В случае, если вы уверены, что var это имеет значение ok, вы можете выполнить явное приведение s.e = (employid)var; . Но, скорее всего, var следовало бы заявить об этом с самого employid начала.

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

1. Привет , итак, проблема возникает из-за того, что я сохраняю свою переменную, которая является частью перечисления, и передаю ее через несколько вызовов функций. Таким образом , s.e=var выдает ошибку, хотя функция, из которой она была передана, объявила ее как часть перечисления. Странный