2011-01-12 8 views
2

SDL_Eventは、符号なし8ビット型の共用体であり、最初の要素が符号なし8ビット型である多くの構造体です。推奨される用途は、ユニオンのUint8要素にアクセスして、そのイベントがどのタイプかを判定し、そのタイプに適した要素によってユニオンにアクセスすることです。最初の要素を共有する構造体の和集合は未定義の動作ですか?

これは、型識別子に予約された同じ領域を持つ共用体のすべての型によって明らかに異なります。これが当てはまるかどうか、あるいはこの未定義の振る舞いですか?

編集:タイトルをよりわかりやすくしました。

+0

「タイプ識別子」とは何ですか? 'uint8_t'またはそれ以外のもの? Cの組合は本質的にその型を格納しません。 –

+0

@R ..はい、私が信じているUint8は、uint8_tにtypedefされています。 –

答えて

5

構造体の最初の要素は、構造体の先頭から「オフセット0」にあることが保証されています。それは安全でなければなりません。

4

私はC99規格で見つけました。

6.5.2.3.5:

一つの特別な保証は労働組合の使用を簡素化するために構成されています。組合は 、いくつかの共通の初期シーケンスを共有する構造(下記参照)、およびもし組合が含まれている場合 オブジェクトには現在これらの構造体のいずれかが含まれていますが、共通型の宣言が表示されている場所であれば、 共通部分の最初の部分を確認することができます。 1つまたは複数の初期メンバーのシーケンスの対​​応するメンバーが 互換タイプ(ビットフィールドの場合は同じ幅)を持つ場合、2つの構造は共通の初期シーケンスを共有します。

SDLの実装が正しいことが保証されているようです。 Uint8のみを含む構造体を使用していた場合は保証されますが、裸のUint8は未定義の動作であり、期待どおりに動作する可能性が非常に高いと思います。

+0

あなたは正しいです。私は標準の別のバージョンでそれを見たことがあるか、それを想像したかもしれません:) – Jester

関連する問題