#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 выдает ошибку, хотя функция, из которой она была передана, объявила ее как часть перечисления. Странный