GNU GCC 4.7.0+では、いくつかの厳密なエイリアシング警告が表示されましたが、これを解決したいと思います。
私は(ハードウェアからの)ペイロードを持っています:
unsigned char payload[davidlt::PAYLOAD_SIZE];
私はこの行を持っていました:
*(uint32_t*)(payload + davidlt::DATA_OFFSET) = (pid & davidlt::PID_MASK) << davidlt::PID_SHIFT;
これにより、ペイロード内の特定の場所へのポインタが作成され、4バイトはとして解釈されuint32_t
ます。新しい値uint32_t
タイプが計算され、ペイロードで置き換えられます。
私は得る:
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
を使用して解決したいと思っていましたreinterpret_cast
が、同じ警告が表示されます。
*reinterpret_cast<uint32_t *>(payload + davidlt::DATA_OFFSET) = (pid & davidlt::PID_MASK) << davidlt::PID_SHIFT;
私が理解したように、許可されているchar
またはunsigned char
に任意のデータを変換できますが、それは一方向にしか機能しません。
1つの解決策は、を作成することunion
です。データへの異なるタイプの参照を作成する他の方法はありませんでしたunsigned char
か?
ありがとう!デビッド