Hatena::Groupcprogramming

Going My C Way このページをアンテナに追加 RSSフィード

2010年11月22日(月)

offsetof()

| 17:13 | offsetof() - Going My C Way を含むブックマーク はてなブックマーク - offsetof() - Going My C Way offsetof() - Going My C Way のブックマークコメント

offsetof() を書いてみます。これはマクロです。

manpage 抜粋。

       #include <stddef.h>

       size_t offsetof(type, member);

ソース offsetof.c

typedef unsigned long my_size_t;

#define my_offsetof(type_, member_) \
    ((my_size_t)&((type_ *)((void *)0))->member_)


/*
    ここから下はテスト用の main 関数
*/
#if defined(TEST_MAIN)

#include <stdlib.h> /* EXIT_SUCCESS */
#include "ezput.h"

int main(void)
{
    struct s {
        int a;
        int b;
        int c;
    };

    put_lu(my_offsetof(struct s, a));
    put_lu(my_offsetof(struct s, b));
    put_lu(my_offsetof(struct s, c));

    return EXIT_SUCCESS;
}
#endif /* defined(TEST_MAIN) */

ビルド。(Makefile は 2010年10月24日の日記を参照のこと)

$ make offsetof

テスト。

$ ./offsetof 
my_offsetof(struct s, a) = 0
my_offsetof(struct s, b) = 4
my_offsetof(struct s, c) = 8

OK。(結果の値は環境、処理系によって異なります)