【发布时间】:2015-11-19 13:22:08
【问题描述】:
这是我的枚举声明:
enum connection_primary_identifier_e : uint64_t
{
INVALID_IDENTIFIER = std::numeric_limits<std::underlying_type<connection_primary_identifier_e>::type>::max(),
}
(如果我直接使用uint64_t作为类型,也会发生同样的情况,如果我使用-1或-1ULL)
当我尝试编译文件时,我收到以下错误/警告:
error: integer constant is so large that it is unsigned [-Werror]
error: narrowing conversion of ‘18446744073709551615I128’ from ‘__int128’ to ‘unsigned int’ inside { } [-Werror=narrowing]
error: large integer implicitly truncated to unsigned type [-Werror=overflow]
cc1plus: all warnings being treated as errors
真正奇怪的是,错误实际上是针对另一个文件(使用枚举)上不存在的行(文件最后一行之后的行号为 3)产生的,我确保它没有丢失括号或类似的东西。
更新:
使用uint32_t 不会产生错误。
使用 g++ (GCC) 4.8.3
【问题讨论】:
-
无法重现 (
g++ --version=g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4)。您是否不小心编译/包含了另一个版本的枚举? -
它正在工作here
-
请注意,这些是被视为错误的警告,另外,我已经用正确的 GCC 版本更新了问题,对此感到抱歉。
-
准备一个产生相同警告的 MVCE(例如添加
#include <limits>),使用-c仅编译该文件,并使用-v进行详细输出。将 MVCE 和详细的编译器输出添加到您的问题中。它可能是一个特定于 4.8.3 的错误,但我无法想象会发生这样的事情(它也不在错误跟踪器中)。 -
@Zeta,我尝试使用在线编译器重现它,但我没有这样做,另一方面,我没有找到任何允许我选择编译器版本的在线网站。