3

我已经在我的头文件中声明了这个枚举:

enum wildcard {
  ....
  ....
  NW_SRC  = 0x111UL << 40,
  ....
};

当我编译它时,我收到以下警告:

warning: left shift count >= width of type [enabled by default]

int我认为这是因为枚举类型被编译器视为一个。我该如何解决这个问题?

4

3 回答 3

3

您有两个不同的问题,首先是操作,然后是常量的声明。

对于操作,您可以使用提供的宏inttypes.h

UINT64_C(0x111) << 40

有一个适当宽度的常数。

但是枚举常量是由标准定义的,因此如果在您的平台上只有 32 位宽(很可能)int,这将无法帮助您定义一个足够大以容纳该值的枚举常量。int

于 2013-01-17T16:44:16.880 回答
2

您平台上的UL可能是 32 位的。您可能需要ULL改用:

enum wildcard {
    ....
    ....
    NW_SRC  = 0x111ULL << 40,
    ....
};

这将修复警告,但表达式的结果可能不一定适合 an enum(有关详细信息和对相关标准文档的引用,请参阅此答案)。

于 2013-01-17T16:38:55.910 回答
1

UL是无符号长的,但大多数编译器上的长是 32 位的。你想要ULLunsigned long long。

正如 Jens Gustedt 在他们的回答中正确指出的那样,在 C 中,枚举不能保存大于 int 的值,所以这无济于事。相比之下,C++ 确实允许用更大的整数类型来表示枚举。

于 2013-01-17T16:39:19.483 回答