Tôi có một số mã tôi đang chuyển sang một nền tảng mới, và nó bắt đầu cho tôi một lỗi về việc so sánh hai điều tra viên từ hai danh sách liệt kê khác nhau. Tôi lúng túng tại sao nó lại cho tôi một lỗi về điều này. phầnTại sao tôi gặp lỗi khi so sánh trực tiếp hai enums?
Việc liệt kê một specificers của spec C (6.7.2.2) khẳng định:
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.
Vì vậy, tôi sẽ có thể sử dụng các thành viên enum giống như int hằng số. Trong chương trình mẫu nhỏ này:
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;
}
Khi biên soạn với gcc -Wall -Werror
Tôi nhận được thông báo:
error: comparison between ‘enum first’ and ‘enum second’ [-Werror=enum-compare]
Tôi biết rằng nếu tôi định kiểu cả myf
và mys
như int
s trình biên dịch sẽ được hạnh phúc, giống như Tôi có thể đặt một vài số int
s với các giá trị từ myf
và mys
và thực hiện so sánh; nhưng tại sao tôi phải làm hoặc trong số này để loại bỏ cảnh báo? Tại sao cảnh báo này lại tồn tại ở nơi đầu tiên? Phải có một số nguy hiểm khi làm điều này mà tôi không thấy.
LƯU Ý:
Tôi đã đọc các tài liệu hướng dẫn gcc trên enum-so sánh cờ này, nhưng nó không nói nhiều về bất cứ điều gì:
-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.
Tài liệu gcc khá dễ hiểu. Điều gì không rõ ràng ở đó? – SomeWittyUsername
@icepack - * cách * giải thích đó? Nó nói những gì nó làm, nó không nói một từ về ** tại sao ** bất cứ ai sẽ cần điều đó. Nếu các thành viên của hai enums khác nhau là cả hai loại 'int', tại sao tôi cần một cảnh báo khi so sánh một int int khác? – Mike
Tôi nghĩ rằng nó chỉ cảnh báo bạn bởi vì nó có thể dễ dàng là một sai lầm. Điều duy nhất tôi có thể nghĩ đến là các enums có thể được đại diện bởi các loại khác nhau. – teppic