offsetof & offsetat

 C言語で,offsetofと対になるようなマクロを書いてみたので,記録.

 まず,offsetofとは何か.

offsetof()マクロは、フィールドmemberの構造体typeの先頭からのオフセットを返す。

詳しくはman offsetofをご覧ください.

 なんでオフセットを取得するマクロがあるのに,オフセットを指定して利用するマクロがないんだ?ということで作ったのがこちら.

#define offsetat(ptr,ofs,type) (*(type*)(((void*)(ptr))+(ofs)))

 実際の利用例はこんな感じです.

#include <stdio.h>
#include <stddef.h>

#define offsetat(ptr,ofs,type) (*(type*)(((void*)(ptr))+(ofs)))

struct offset_s {
    double a, b, c;
};
typedef struct offset_s offset_t;

int main()
{
    size_t ofs;
    struct offset_s st;
    st.a = 1.0; st.b = 2.0; st.c = 3.0;
    ofs = offsetof(offset_t, b);
    printf("%f\n", offsetat(&st, ofs, double));
    return 0;
}

 offsetofで得られる値はマシン依存なので,これをプログラム外で利用するのは危険です.例外は,構造体がバイト位置までかっちり仕様として決められている場合ぐらいかな.ExifとかWaveとかそういう類ですね.

 Array of Structure (AOS)のデータ構造に対して,同じ処理を異なるメンバ変数に適用したいので,このようなマクロが必要になりました.