0

私はこのtypedefを持っています:

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

そして、このコンパイラの警告を受け取ります。

BITFIELD bitfield;

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

これで、ビットフィールドの代わりにshortを使用すると、警告が消えます。

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

この警告についてどう考えるかわかりません-わかりません。初期化されていないメモリ読み取り操作もありません。IMHOコンパイラ(VisualDSP ++ 5.0 C / C ++コンパイラ)はここでは間違っています。Timestamp:32にビットフィールドを使用すると、警告も消えます。

気づかなかったことはありますか?この警告を安全に無視できますか?

4

2 に答える 2

3

システム上の の大きさはunsigned int?

私が考えられる唯一の原因は、16 ビットのビットフィールドがTimestamp変数の一部のみを形成している場合です (たとえば、anunsigned intが 32 ビット幅の場合)。

言い換えれば、おそらくコンパイラはそれを次のように変えています:

Timestamp = (Timestamp & 0xffff0000) | 12;

初期化されていない場合、その問題が発生しTimestampます。

それは次のものに適合します:

  • コードはおそらくその直後になるため、16ビットのショートを使用しますTimestamp = 12;
  • それ以降を使用し:32て、直接代入も可能なポイントまでビットフィールドを拡張します。

私の側の純粋な推測ですが、脳死のコンパイラを割り引いて、それが私が思いつくことができる最高のものです(それが本当なら、おそらくまだ脳死ですが、別の方法で).

FWIW、gcc でさえ文句を言いません-Wall

于 2010-06-30T11:32:42.947 に答える
0

この場合、コンパイラがこの警告を出すには少し熱心すぎるように見えることに同意します (ここで見落とされているのは、16 ビット フィールドに使用される 32 ビット ワードの残りがすべてパディングであるということでしょうか)。

私はpurifyなどのツールからこれを取得することに慣れています。

于 2010-06-30T11:32:09.027 に答える