我有这种typedef:
typedef union
{
unsigned Value;
unsigned Timestamp:16;
} BITFIELD;
并获得此编译器警告:
BITFIELD bitfield;
// read from uninitialised memory - may result in unexpected behaviour
bitfield.Timestamp = 12;
现在,当我使用short而不是bitfield时,警告消失了:
typedef union
{
unsigned Value;
unsigned short Timestamp;
} DATATYPE;
我不确定该怎么想这个警告 - 我不明白。没有未初始化的内存,也没有读取操作。恕我直言,编译器( VisualDSP ++ 5.0 C / C ++编译器)在这里是错误的。当我为时间戳使用:32
位域时,警告也会消失。
有什么我没有意识到的吗?我可以安全地忽略此警告吗?
答案 0 :(得分:3)
您系统上的unsigned int
有多大?
我能想到的唯一可能导致这种情况的是,如果16位位域只构成Timestamp
变量的一部分(例如,如果unsigned int
是32位宽)。 / p>
换句话说,也许编译器正在将其转化为:
Timestamp = (Timestamp & 0xffff0000) | 12;
如果Timestamp
未初始化,会导致该问题。
适合:
Timestamp = 12;
。:32
,因此,它会将位域扩展到可以直接分配的位置。对我来说纯粹的假设,但是,对于脑死亡编译器的折扣,这是我能想到的最好的(如果它是真的,它可能仍然脑死亡但以不同的方式)。
FWIW,即使使用-Wall
,gcc也不会抱怨。
答案 1 :(得分:0)
我同意编译器似乎有点过于急于在这种情况下给出这个警告(我想知道这里错过的是用于16位字段的32位字的剩余部分是否都是填充)。
我更习惯从purify等工具中获取它。