„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)?