Mam pewien kod, który przesyłam na nową platformę, i zaczęto podawać mi błąd dotyczący porównywania dwóch enumeratorów z dwóch różnych list wyliczeniowych. Jestem zdezorientowany, dlaczego daje mi to błąd.Dlaczego pojawia się błąd podczas bezpośredniego porównywania dwóch wyliczeń?
wyliczenia specificers odcinek spec C (6.7.2.2) stwierdza:
The identifiers in an enumerator list are declared as constants that have type int and may appear wherever such are permitted.127) An enumerator with = defines its enumeration constant as the value of the constant expression. If the first enumerator has no =, the value of its enumeration constant is 0.
Więc powinienem być w stanie wykorzystać członków enum tak samo jak int stałych. W tym małym programem próbki:
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;
}
Kiedy skompilowany z gcc -Wall -Werror
otrzymuję komunikat:
error: comparison between ‘enum first’ and ‘enum second’ [-Werror=enum-compare]
wiem, że gdybym typecast zarówno myf
i mys
jak int
s kompilator będzie zadowolony, podobnie jak Mogę ustawić kilka z int
s z wartościami z myf
i mys
i wykonać porównanie; ale dlaczego muszę je usunąć, aby usunąć ostrzeżenie? Dlaczego to ostrzeżenie istnieje w pierwszej kolejności? Musi być pewne niebezpieczeństwo w tym, że nie widzę.
UWAGA:
Czytałem dokumentację gcc tego enum-porównać flagą, ale to nie mówi wiele o niczym:
-Wenum-compare
Warn about a comparison between values of different enumerated types. In C++ enumeral mismatches in conditional expressions are also diagnosed and the warning is enabled by default. In C this warning is enabled by -Wall.
Dokumentacja gcc jest dość objaśniająca. Co tam nie jest jasne? – SomeWittyUsername
@icepack - * jak * jest to objaśniające? Mówi, co robi, nie mówi ani słowa o tym, dlaczego ** ktoś by tego potrzebował. Jeśli członkowie dwóch różnych wyliczeń są oba typu "int", dlaczego potrzebuję ostrzeżenia przy porównywaniu jednego int do innego int? – Mike
Myślę, że to tylko ostrzeżenie, ponieważ może to łatwo być błędem. Jedyne, co mogę wymyślić, to to, że wyliczenia mogą być potencjalnie reprezentowane przez różne typy. – teppic