C++ 在C+;中使用long初始化枚举时出现问题+;
我正在尝试使用类型标签的哈希代码初始化枚举:C++ 在C+;中使用long初始化枚举时出现问题+;,c++,enums,long-integer,C++,Enums,Long Integer,我正在尝试使用类型标签的哈希代码初始化枚举: enum ValueType { CLOSED = hashCode("CLOSED"), OPEN = hashCode("OPEN"), SEKIHAIRITSU = hashCode("SEKIHAIRITSU"), ZWEITMANDAT = hashCode("ZWEITMANDAT") }; ValueType valuety
enum ValueType {
CLOSED = hashCode("CLOSED"),
OPEN = hashCode("OPEN"),
SEKIHAIRITSU = hashCode("SEKIHAIRITSU"),
ZWEITMANDAT = hashCode("ZWEITMANDAT")
};
ValueType valuetype;
hashCode
函数是Java函数的一个实现:
constexpr long hashCode(const char *string) {
long h = 0;
int off = 0;
for (int i = 0; i < strlen(string); i++) {
h = 31 * h + string[off++];
}
return h;
}
constexpr长hashCode(const char*string){
长h=0;
int off=0;
for(int i=0;i
我在Sekihairitsu
和Zweitmandat
上收到一个错误:
表达式必须有一个常量值--值超出了“long”的范围
奇怪的是,它并不长。当我自己运行hashCode
函数时,它会为Sekihairitsu返回-1606024481
,为Zweitmanad返回-710079088
。它们都不在long甚至int的范围之外
有人知道问题出在哪里吗?我已经尝试了
枚举值类型:long
您有整数溢出。问问自己,当你处理的所有东西都是正数时,你是如何得到负数的。在我的平台上,std::strlen
不是constexpr
。(不确定是否应该,我的编译器也不兼容。)@NathanOliver我知道,但为什么?我自己运行了这个函数,它运行正常,没有整数溢出。枚举初始化中的什么会导致整数溢出?有符号整数溢出是未定义的行为,但您始终可以使用这样的无符号类型@MatG谢谢,我让它变得更简单了。只需将constepr long
更改为constepr unsigned long
,以同样的方式更改h
,它就可以工作了!