風で飛んでいくチラ裏

気ままに雑記メモ書き殴り。古い記事は別blogからの引っ越しなのでレイアウトがアレです。

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