У меня есть код, который я переношу на новую платформу, и он начал давать мне ошибку в сравнении двух счетчиков из двух разных списков перечислителей. Я смущен, почему это дает мне ошибку об этом.
Раздел спецификаторов перечислений в спецификации C (6.7.2.2) гласит:
Идентификаторы в списке перечислителей объявляются как константы, которые имеют тип int и могут появляться везде, где это разрешено. 127) Перечислитель с = определяет его константа перечисления как значение постоянного выражения. Если первый счетчик no =, значение его константы перечисления равно 0.
Итак, я должен иметь возможность использовать элементы перечисления так же, как и int-константы. В этой небольшой примерной программе:
enum first {
a,
b
};
enum second {
c,
d
};
int main(){
enum first myf = a;
enum second mys = c;
if(myf == mys)
printf("same value\n");
return 0;
}
Когда скомпилировано с gcc -Wall -Werror
, я получаю сообщение:
error: сравнение между 'enum first и' enum second [-Werror = enum-compare]
Я знаю, что если я привожу как myf
, так и mys
как int
, то компилятор будет счастлив, так же как я могу установить пару int
со значениями из myf
и mys
и сделать сравнение; но почему я должен сделать это, чтобы избавиться от предупреждения? Почему это предупреждение существует в первую очередь? В этом должна быть какая-то опасность, которую я не вижу.
ПРИМЕЧАНИЕ.. Я прочитал документацию gcc по этому флагу перечислимого числа, но он ничего не говорит:
-Wenum-сравнить
Предупредите о сравнении значений различных перечисленных типов. В С++ перечислены также нечеткие совпадения в условных выражениях, и предупреждение включено по умолчанию. В C это предупреждение включено -Wall.