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