warning: result of comparison of unsigned enum expression < 0 is always false
警告:unsigned enum 式 < 0 の比較結果は常に偽である。
[-Wtautological-unsigned-enum-zero-compare]
■enumのメンバーに負値が無いと符号無し(unsigned)
#include <stdio.h>
typedef enum {
A=0,//符号なしになる
B,
C}
typeA ;//負値無しのenum型
int main(void){
typeA x = -1;
if(x >= 0){
puts("符号なし!こちらが表示されます");
}else{
puts("符号付き");
}
}
enum型はメンバ内の負値の有無に応じて
符号付きになったり、
符号無しになったりします。
enumのメンバに負値がない場合
enumの型はgcc,clangでは
type A xは
符号無しになりました。
このためxは負値にならないのでif文は成立します。
■enumのメンバーに負値が有ると符号付き(signed)
#include <stdio.h>
typedef enum {
A=-1,//符号付きになる
B,
C}
typeA ;//負値ありのenum型
int main(void){
typeA x = -1;
if(x >= 0){
puts("符号なし");
}else{
puts("符号付き!こちらが表示されます");
}
}
enumのメンバに負値がある場合
enumの型はgcc,clangでは
type A xは
符号付きになりました。
このためxは負値になるのでif文は成立しません。
■注意:この警告は-Wallに含まれません
この警告は現在 gcc では出ません。
clang の-Wallにも含まれず
-Wtautological-unsigned-enum-zero-compare
オプションで出ます。
参考:
INT09-C. 列挙定数が一意の値に対応することを保証する