2

SDL_Eventは、符号なし 8 ビット型と、最初の要素が符号なし 8 ビット型である多くの構造体の和集合です。推奨される使用方法は、共用体の Uint8 要素にアクセスしてイベントの型を判別し、その型に適した要素で共用体にアクセスすることです。

これは明らかに、タイプ識別子用に予約された同じスペースを持つユニオン内のすべてのタイプに依存します。これが事実であると確信できますか、それとも未定義の動作ですか?

編集:タイトルをよりわかりやすいものにしました。

4

2 に答える 2

5

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

于 2011-01-12T16:11:26.737 に答える
4

C99標準で見つけました。

6.5.2.3.5:

共用体の使用を簡素化するために、1 つの特別な保証が行われます。共用体に、共通の初期シーケンス (以下を参照) を共有する複数の構造体が含まれている場合、および共用体オブジェクトに現在これらの構造体の 1 つが含まれている場合、共通の構造体を検査することが許可されます。それらの最初の部分は、共用体の完全な型の宣言が表示される場所であればどこでも使用できます。対応するメンバーが 1 つ以上の初期メンバーのシーケンスに対して互換性のある型 (およびビット フィールドの場合は同じ幅) を持っている場合、2 つの構造体は共通の初期シーケンスを共有します。

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

于 2011-01-12T17:30:22.260 に答える