„Container_of” jądra - jakikolwiek sposób, aby był zgodny z ISO?

Patrząc na implementację jądra Linuksa dla podwójnie połączonych list okrągłych, znalazłem następujące makro:

<code>#define container_of(ptr, type, member) ({           \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
</code>

Sposób działania polega na tym, że zwraca wskaźnik do struktury, podając tylko adres jednego z jego członków:

<code>struct blabla
{
    int value;
    struct list_head *list;
}
</code>

W ten sposób możesz uzyskać wskaźnik do blabla (i dostać się do „value”) podając tylko wskaźnik do listy. Na moje pytanie, w jaki sposób uczyniłbym to tak przenośnym, jak to możliwe (najlepszy przypadek zgodny z C89 / C99?). Z powodu użycia typeof () jest to tylko gcc.

Oto, co mam do tej pory:

<code>#define container_of(ptr, type, member) (                  \
                (type *) (char *)(ptr)-offsetof(type,member)\
                )
</code>

Czy ten fragment jest zgodny ze standardami ISO (a zatem powinien być możliwy do skompilowania na dowolnym zgodnym kompilatorze)?

questionAnswers(3)

yourAnswerToTheQuestion