"Container_of" do Kernel - alguma maneira de torná-lo compatível com ISO?

Enquanto observava a implementação de listas circulares duplamente ligadas do kernel do Linux, encontrei a seguinte macro:

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

A maneira como isso funciona é que ele retorna o ponteiro para a estrutura, dado apenas o endereço de um de seus membros:

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

Assim, você pode obter o ponteiro para blabla (e chegar ao "valor"), dado apenas o ponteiro para a lista. Para minha pergunta, como eu faria isso tão portátil quanto possível (melhor caso em conformidade com C89 / C99?). Devido ao uso de typeof (), este é apenas o gcc.

Isso é o que eu tenho até agora:

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

Esse snippet está em conformidade com os padrões ISO (e, portanto, deve poder ser compilado em qualquer compilador em conformidade)?

questionAnswers(3)

yourAnswerToTheQuestion