Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

本日見かけた酷いコード4

タグ: C++ 酷いコード
struct coord
{
#ifdef BIG_ENDIAN
	short x : 8;
	short y : 8;
#else
	short y : 8;
	short x : 8;
#endif
};

ビットフィールドというものは、互換性を考えるとなかなかに面倒な仕組みである。

まず、ビットフィールドで使える型は、JISX3010:2003によると

ビットフィールドの型は、修飾版又は非修飾版の_Bool、signed int、unsigned int又は他の処理系定義の型でなければならない。

とある。

なので処理系で定義されてさえいればshort型も使えるわけだが、しかしわざわざそのような型を使うことにどれほどの意味があろう。
ここは素直にsigned intかunsigned intを使っておけば良い。

なお、ビットフィールドでは「intの挙動も処理系定義」である。

ただし、ビットフィールドの場合、型指定子intがsigned intと同じ型を表すか、unsigned intと同じ型を表すかは処理系定義とする。

「符号付き整数型であることは保証されていない」ので注意。

そしてさらに気をつけなければならないのは、「ビットフィールドの並びがバイトオーダーで一意に求まるわけではない」ということ。
ビットフィールドの並びは、規格では以下のようにある。

単位内のビットフィールドの割付けの順序(上位から下位か又は下位から上位か)は、処理系定義とする。

特定の処理系でバイトオーダーとビットオーダーの関係を調べたとしても、それが他の処理系でも通用するかは判らない。
そのため、バイナリ互換が必要な場面でビットフィールドを使うのは何かと危険である。

もっとも。
このコードに関して言えば、以上のようなビットフィールドに関する細かい話はどうでもよく、ただ

struct coord
{
	char x;
	char y;
};

こうすればいいじゃないか、というだけのことなのだが。

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/21-ada32e42
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。