CFAQを読む - 2
http://www.kouno.jp/home/c_faq/c2.html#0
2.1
x1は実際に使うときも
struct x1 local_x1;
という使い方になる。
2.4
------
typedef struct { int x; int y; } DATA;
------
------
typedef DATA* P_DATA;
------
使う側は P_DATA をモジュールから取得したり操作してもらったりするんだろうな。
2.6
typedef union {
char raw[16];
struct {
unsigned char id;
unsigned char flg;
unsigned char err;
unsigned char data[1];
} pkt;
} U_HOGE_PACKET;
こんなんかな。パケット構造のデータ部分へのポインタ扱いという感じかねぇ。 どっちにしろ構造体内のデータアラインとかも気にしないといかんね。
2.8
構造体比較。
memcmp*1;
アラインメントの都合でobj1やobj2にパディングがあったとき、そのパディングにどんなデータが詰められるかは実装依存なので、上のチェック方法は(上手く動く場合が多いけど)間違い。
javaとかのオブジェクト比較だと何比較してるんだっけな。 指し示すポインタが同じなら同じものとしてるだけかな? それぞれ別の場所にある構造体だけど、中身が一緒かどうかを確認するなら 確認用の関数を書く必要があるよなぁ。
2.9
構造体の値渡しや戻しは怖くてできない!w ポインタ渡しだな…。
2段落目の説明の仕組みによって、以下の様な関数が実は動く...はず。
---
typedef struct {int num} ST_A;
ST_A hoge(ST_A src)
{
ST_A ret;
ret.num = src.num+1;
return ret;
}
---
ST_A c = hoge(hoge(a));
---
hogeから返るretは関数内ローカルなので、関数を抜けると値が保証できなくなると思われがちだけど、1文実行中の間くらいは特定の領域に置かれているので、上手く動く。
2.10
名無し構造体があるコンパイラもあったけど、使いこなしたことがない。 今度勉強してみるかな。
2.11
構造体の外部I/Oも、比較と同様に専用関数を用意してあげるのがよいかと思います。
2.13
構造体内のデータアラインメントは環境が変わるたびに気をつけましょう。
とりあえずここまで。
*1:void *)obj1, (void *)obj2, sizeof(OBJ_TYPE