0

我有这个类型定义:

typedef union
{
    unsigned Value;
    unsigned Timestamp:16;
} BITFIELD;

并得到这个编译器警告:

BITFIELD bitfield;

// read from uninitialised memory - may result in unexpected behaviour
bitfield.Timestamp = 12;

现在,当我使用短而不是位域时,警告消失了:

typedef union
{
    unsigned Value;
    unsigned short Timestamp;
} DATATYPE;

我不确定如何看待这个警告 - 我不明白。不涉及未初始化的内存,也没有读取操作。恕我直言,编译器(VisualDSP++ 5.0 C/C++ Compiler)在这里是错误的。当我对Timestamp:32使用位域时,警告也会消失。

有什么我没有意识到的吗?我可以放心地忽略此警告吗?

4

2 回答 2

3

你的系统有多大unsigned int

我能想到的唯一可能导致这种情况的是 16 位位域是否仅构成Timestamp变量的一部分(例如,如果 anunsigned int是 32 位宽)。

换句话说,也许编译器正在把它变成:

Timestamp = (Timestamp & 0xffff0000) | 12;

Timestamp如果未初始化,这将导致该问题。

这符合:

  • 使用 16 位短,因为代码可能会变成Timestamp = 12;.
  • 使用:32since,它将位域扩展到也可以直接分配的点。

纯粹是我的假设,但不考虑脑死亡的编译器,这是我能想到的最好的(如果是真的,它可能仍然是脑死亡,但方式不同)。

FWIW,gcc 即使使用-Wall.

于 2010-06-30T11:32:42.947 回答
0

我同意编译器在这种情况下似乎有点过于急于给出这个警告(我想知道这里是否遗漏了用于 16 位字段的 32 位字的剩余部分都是填充)。

我更习惯于从 purify 等工具中获取此信息。

于 2010-06-30T11:32:09.027 回答