Kernels "container_of" - wie kann man es ISO-konform machen?

Beim Betrachten der Implementierung von doppelt verknüpften Zirkellisten im Linux-Kernel habe ich folgendes Makro gefunden:

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

Das funktioniert so, dass es einen Zeiger auf die Struktur zurückgibt, wenn nur die Adresse eines seiner Mitglieder angegeben ist:

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

So können Sie Zeiger auf blabla bekommen (und auf "value" bekommen), wenn Sie nur Zeiger auf list haben. Auf meine Frage, wie würde ich das so portabel wie möglich gestalten (best case konform zu C89 / C99?). Aufgrund der Verwendung von typeof () ist dies nur gcc.

Folgendes habe ich bisher:

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

Entspricht dieses Snippet den ISO-Standards (und sollte daher auf jedem kompatiblen Compiler kompiliert werden können)?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage