を中断します32ビットCortex M0。タイプ間接参照型punnedポインタは、私は、このコードでは(「厳格なエイリアシング規則を破るだろうタイプの間接参照型punnedポインタを」)警告コンパイラを持っている厳格なエイリアシング規則
警告にもかかわらず、正常に動作しています。私の質問は、警告を解決できるかどうかです。
を中断します32ビットCortex M0。タイプ間接参照型punnedポインタは、私は、このコードでは(「厳格なエイリアシング規則を破るだろうタイプの間接参照型punnedポインタを」)警告コンパイラを持っている厳格なエイリアシング規則
警告にもかかわらず、正常に動作しています。私の質問は、警告を解決できるかどうかです。
保存期間を他の(互換性のない)タイプのオブジェクトとして割り当てられていないオブジェクトを再解析することは、未定義の動作です。
Buff
のタイプがuint8_t
で、静的または自動保存期間のいずれかがある場合は、タイプDWORD
として再解釈されています。これらのタイプは互換性がありません、動作は定義されていません。
あなたは、単にDWORD
ように表示される、あなたが使用するタイプとしてBuff
を定義する必要があります。
volatile DWORD Buff[READ_BUFF_SIZE];
をし、その後、あなたは単に組み込みのオペレータが行います使用して、アクセス用のマクロを必要としません。我々が想定している場合でも
ChunkID = Buff[0];
uint8_tはunsigned charとして定義されています。任意の型のエイリアスでもよく、型
DWORD
は別名
unsigned char
ではありません。
標準タイプuint8_t
をCHAR_BIT拡張整数型を見る8.であってもunsigned char
として定義されていないことを可能にします。
ええ、まともな答えですが、重複の問題を少なくしません。 –
@JonathanLeffler「ちゃんと」だけ? :-)ええ、私はそれが 'ちょっと' dupだと思います。 – 2501
よかったら、意味をなさえ!私はいつもなぜ警告が生成されているのか知りたい。リンクありがとう、私はいくつかを読んで理解した。 uint8以外のものとしてバッファを宣言することはできません。なぜなら、それをそのまま使用するルーチンが多いからです。しかし、他のいくつかのデータでは、データはuint16、uint32などのように意味があります。元のバッファー上で共用体を使用すると、より洗練された方法で解決できます。ありがとう。 – user1797147
* strict aliasing * ruleを参照してください。それは広いテーマです。 –
...あなたのお気に入りの検索エンジンに警告を貼り付けてみましたか?またはこの非常にサイト? –
関連:http://stackoverflow.com/questions/2958633/gcc-strict-aliasing-and-horror-stories –