【发布时间】:2014-02-11 23:48:24
【问题描述】:
当我运行以下代码时 - 我收到警告“从 int 到 {} 内的 long unsigned int 的缩小转换在 C++11 [-Wnarrowing] 中格式错误。我使用的是 GNU 4.8 编译器。
typedef struct TableEntry
{
unsigned long value;
const char *label;
} TableEntry;
enum FunctionType
{
NORMAL = 0,
RANGE = 1
};
TableEntry functionTypes[] =
{
{NORMAL, "NORMAL"},
{RANGE, "RANGE"}
};
我不明白为什么编译器将枚举视为 int?
这是 GCC 4.8 中的错误吗?有什么解决方法吗?
任何帮助表示赞赏。
【问题讨论】:
-
我相信枚举总是被视为
ints 幕后。如果您不指定枚举值的值,它们默认为 0、1、2,... 在这种情况下,您应该可以使用隐式转换,因为转换不应该花费您任何准确性。 -
我们在每个文件中都有这些警告。大约 150 个文件。我的老板不喜欢看到这些警告。
-
这是有效的 C++03 代码,因此 g++ 的警告很可能是没有根据的。如果 C++11 标准彻底破坏了 C++03 代码,那确实值得注意。也就是说,这只是 number 值不使用无符号整数的另一个原因。
-
只要您确定隐式转换不会给您带来任何问题,您可以暂时禁用警告。但我真的不建议将其作为长期解决方案,因为启用该警告可能会在其他数据转换场景中为您省去麻烦。
-
枚举 FunctionType : unsigned long { /* etc */ };这是向后做的,请修复结构声明。
标签: c++ c c++11 gcc-warning gcc4.8