【问题标题】:Why does g++ warn me about comparing enum values with specified underlying types?为什么 g++ 警告我将枚举值与指定的基础类型进行比较?
【发布时间】:2017-09-21 15:02:50
【问题描述】:

这段代码:

enum : unsigned { foo = 4 };
enum : unsigned { bar = 32 };

int main() { return bar > foo; }

给我以下警告(使用 GCC 5.4.0):

$ g++ --std=c++11 -o a a.cpp
a.cpp: In function ‘int main()’:
a.cpp:4:27: warning: comparison between ‘enum<anonymous>’ and ‘enum<anonymous>’ [-Wenum-compare]
 int main() { return bar > foo; }
                     ^

这是为什么呢?我已经明确指定了这些枚举值的类型,比较它们没有任何不确定性。我什至对两个枚举都使用了相同的类型(没关系)。那么这里的交易是什么?

请注意,clang (3.8.0) 不会产生此警告,即使使用 -Wall

【问题讨论】:

  • 您将苹果与橙子进行比较。您可以关闭或忽略警告。很难想象在哪些情况下这是合法的,但如果您知道这是明智的,那么您可以将一侧转换为另一侧的类型或将两侧转换为通用类型。如果它是可衡量的,为什么要使用enum 而不是unsigned?如果它不可测量,为什么要比较它?为什么要比较不同的不可测量单位?
  • @DavidSchwartz:实际上,imagine 并没有那么难。

标签: gcc enums clang compiler-warnings underlyingtype


【解决方案1】:

这是为什么呢?我已经明确指定了这些枚举值的类型,比较它们没有任何不确定性。我什至对两个枚举都使用了相同的类型(没关系)。那么这里的交易是什么?

警告没有说明不确定性,它告诉您您正在比较不同的类型。如果这些值由不同的类型表示,那么它表明它们意味着不同的东西,因此比较它们可能是有问题的。正如 David 所说,将 N 个苹果与 M 个橙子进行比较是很奇怪的,应该受到警告。

基础类型不会改变任何东西,因为foo 不是unsigned,而bar 不是unsigned。如果您想比较 unsigned 的值,那么编译器会假定您使用的是 unsigned 而不是枚举类型。

根据您对另一个答案的评论:

因为我将枚举用于(不同)类中的常量——比如限制和大小。

为什么?为此使用 constexpr 静态数据成员有什么问题?

这在 C++ 核心指南中有所涉及,请参阅 Avoid unnamed enumerations:

在没有指定整数常量的便捷替代方法之前编写的代码中并不少见。

替代方案:改用 constexpr 值。

【讨论】:

  • "使用 constexpr 等有什么问题?"啊!我自己也有asked,我也有answer
  • 另外,你写的比较“可能有问题”。我想这有时可能是真的——但这种比较并不是固有地有问题的。在某些情况下,将uint32_tuint16_t 进行比较也可能存在问题(例如,您可能会忘记 RHS 较小,并尝试将其增加到设置为 2^16 的 LHS)。或者在整数算术中使用逻辑运算的结果;这通常很有用,但很可能是新手程序员忘记使用括号的结果 (5 + 5 &gt; 9)。但是你不会就那种代码给我一个警告,对吧?
猜你喜欢
  • 1970-01-01
  • 2011-02-08
  • 2016-11-30
  • 1970-01-01
  • 2022-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多