新しいプラットフォームに移植するコードがいくつかありますが、2 つの異なる列挙子リストの 2 つの列挙子を比較するとエラーが発生し始めました。これについてエラーが発生する理由がわかりません。
C 仕様 (6.7.2.2) の列挙仕様セクションには、次のように記載されています。
列挙子リスト内の識別子は、int 型の定数として宣言され、許可されている場所であればどこにでも表示できます。127) = を持つ列挙子は、その列挙定数を定数式の値として定義します。最初の列挙子に = がない場合、その列挙定数の値は 0 です。
したがって、int 定数と同じように enum メンバーを使用できるはずです。この小さなサンプル プログラムでは:
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
と、次のメッセージが表示されます。
エラー: 'enum first' と 'enum second' の比較 [-Werror=enum-compare]
myf
andの両方を型キャストすると、コンパイラが満足することはわかっていmys
ますint
。ちょうど、andint
の値をいくつかの s に設定して比較を行うことができるのと同じです。しかし、警告を取り除くためにこれらのいずれかを実行する必要があるのはなぜですか? そもそもなぜこの警告が存在するのですか?これを行うには、私が見ていない何らかの危険があるに違いありません。myf
mys
注:
この enum-compare フラグに関する gcc のドキュメントを読みましたが、多くのことは語られていません。
-Wenum-compare
異なる列挙型の値の比較について警告します。C++ では、条件式の列挙型の不一致も診断され、デフォルトで警告が有効になっています。C では、この警告は -Wall によって有効になります。