qt QFlags:有符号值超出枚举常量的范围



在构建qt C++项目时,我收到了枚举值xxxxx920P4的以下警告。我在调试中发现xxxxx920P4现在等于xxxxxundefine(0x00000000(,这导致了意外的结果。我应该如何解决这个问题?

我使用的是Qt版本:4.8.7和Visual studio 2010。

以下循环将不会执行。gVersions[0].verNum"xxxxx920P4",所以我猜"xxxxx920P4"的值被截断了,现在它等于0x00000000

for(int i=0; gVersions[i].verNum != xxxxxundefine ; i++)
{
}

Qt-Qflags类的文档:https://doc.qt.io/qt-5/qflags.html

warning C4341: 'xxxxx920P4' : signed value is out of range for enum constant

warning C4309: 'initializing' : truncation of constant value
enum Version
{
xxxxxundefine   = 0x00000000,
xxxxx400     = 0x00000001,
xxxxx401     = 0x00000002,
xxxxx410     = 0x00000004,
xxxxx411     = 0x00000008,
xxxxx412     = 0x00000010,
xxxxx420     = 0x00000020,
xxxxx430     = 0x00000040,
xxxxx431     = 0x00000080,
xxxxx432     = 0x00000100,
xxxxx440     = 0x00000200,
xxxxx500     = 0x00000400,
xxxxx510     = 0x00000800,
xxxxx520     = 0x00001000,
xxxxx521     = 0x00002000,
xxxxx600     = 0x00004000,
xxxxx611     = 0x00008000,
xxxxx620     = 0x00010000,
xxxxx621     = 0x00020000,
xxxxx700     = 0x00040000,
xxxxx910     = 0x00080000,
xxxxx910P5   = 0x00100000,
xxxxx910P6   = 0x00200000,
xxxxx910P11  = 0x00400000,
xxxxx910P12  = 0x00800000,
xxxxx910P13  = 0x01000000,
xxxxx910P14  = 0x02000000,
xxxxx910P15  = 0x04000000,
xxxxx910P16  = 0x08000000,
xxxxx920     = 0x10000000,
xxxxx920P1   = 0x20000000,
xxxxx920P2   = 0x40000000,
xxxxx920P3   = 0x80000000,
xxxxx920P4   = 0x100000000,
}; Q_DECLARE_FLAGS(Versions, Version)

最后一个值太long,无法放入非长整型。虽然较新的编译器可能会尝试为其选择更大的整型,但一些较旧的编译器会抱怨。GCC倾向于执行前者,除非您显式地选择类型。请注意,倒数第二个值0x80000000或任何涉及它的掩码组合都不适合int,它本质上是负的-2147483648。

enum Version : long long  
{
//...
xxxxx920P4   = 0x100000000,
}; 

PS。显然,Qt5不支持与(unsigned(int不同的东西:https://doc.qt.io/qt-5/qflags.html

最新更新