Ядро& #39;s «контейнер _of» -есть ли способ сделать его соответствующим ISO?

Изучая реализацию двусвязных циклических списков в ядре Linux, я обнаружил следующий макрос:

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

Это работает так, что возвращает указатель на структуру дает только адрес одного из ее членов:

struct blabla
{
    int value;
    struct list_head *list;
}

Таким образом, вы можете получить указатель на blabla (и получить "значение" )по указателю только на список. На мой вопрос, как мне сделать это как можно более портативным (в лучшем случае, соответствующем C89/C99? ). Из-за использования typeof ()это только gcc.

Это то, что у меня есть на данный момент:

#define container_of(ptr, type, member) (                  \
                (type *) (char *)(ptr)-offsetof(type,member)\
                )

Соответствует ли этот фрагмент стандартам ISO (и, следовательно, его можно скомпилировать на любом соответствующем компиляторе )?

13
задан pruzinat 22 April 2012 в 16:25
поделиться