Linuxカーネルの二重にリンクされた循環リストの実装を見ていると、次のマクロが見つかりました。
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
これが機能する方法は、メンバーの1つのアドレスのみが指定された構造体へのポインターを返すことです。
struct blabla
{
int value;
struct list_head *list;
}
したがって、リストへのポインタのみを指定すると、blablaへのポインタを取得できます(そして「値」に到達できます)。私の質問に対して、これを可能な限りポータブルにするにはどうすればよいですか(C89 / C99に準拠したベストケース?)。typeof()を使用しているため、これはgccのみです。
これは私がこれまでに得たものです:
#define container_of(ptr, type, member) ( \
(type *) (char *)(ptr)-offsetof(type,member)\
)
このスニペットはISO標準に準拠していますか(したがって、準拠しているコンパイラーでコンパイルできるはずです)?