Контейнер ядра Linux macro_of и универсальные контейнеры в ANSI-C - PullRequest
3 голосов
/ 08 апреля 2011

Возможно ли реализовать макрос container_of в ANSI-C?Я не уверен, как это сделать в ANSI-C, поскольку реализация ядра зависит от GCC Hacks , таких как оператор typeof.

Я спрашиваю, потому что хотел быреализовать универсальный контейнер в ANSI-C, аналогичный связанному списку ядра .Фактический контейнер, о котором я думаю, - это упорядоченный набор, аналогичный тому, который вы можете получить из Boost MultiIndex .

1 Ответ

10 голосов
/ 08 апреля 2011

Использование typeof в определении ядра container_of() только для проверки типов во время компиляции - это гарантирует, что переданный ptr действительно является указателем на тот же тип, что и member. Это может быть изменено, чтобы быть полностью ANSI C за счет этой проверки типа:

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

(offsetof() в <stddef.h>)

...