我在头文件中声明了这个枚举:
enum wildcard {
....
....
NW_SRC = 0x111UL << 40,
....
};
当我编译它时,我收到以下警告:
warning: left shift count >= width of type [enabled by default]
我认为这是因为编译器将枚举类型视为int
。我该如何解决这个问题?
答案 0 :(得分:3)
你有两个不同的问题,首先是操作,然后是常量的声明。
对于操作,您可以使用inttypes.h
UINT64_C(0x111) << 40
具有适当宽度的常数。
但是根据标准的定义,枚举常量为int
,因此如果在您的平台int
上只有32,则无法帮助您定义一个足够大的枚举常量来保存值位宽(很可能)。
答案 1 :(得分:2)
您平台上的UL
可能是32位。您可能需要使用ULL
代替:
enum wildcard {
....
....
NW_SRC = 0x111ULL << 40,
....
};
这将修复警告,但表达式的结果可能不一定适合enum
(有关详细信息和相关标准文档的参考,请参阅this answer。)
答案 2 :(得分:1)
UL
是无符号长的,但多数编译器的长期是32位。您希望ULL
为无符号长整数。
但是正如Jens Gustedt在答案中正确指出的那样,在C中,枚举不能保持大于int的值,所以这无济于事。相反,C ++允许枚举用更大的整数类型表示。