The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"помогите разобраться в макросе"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"помогите разобраться в макросе"  
Сообщение от чудо email on 20-Янв-07, 17:56 
макрос объявлен в linux/kernel.h
используется для получения структуры из содержащей ее структуры
в частности многие структуры в ядре связаны списками типа struct list_head,которые ничего не содержат,кроме указателей на следующий и предыдущий элемент.
этот макрос должен извлекать структуру по указателю,типу структуры и имени члена в структуре

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

как понимать выражение ((type *)0)->member?
и что такое __mptr?

еще нашел,что такое offsetof
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

если можете,поясните максимально днтально работу макроса container_of
спасибо.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "помогите разобраться в макросе"  
Сообщение от Michelnok (ok) on 20-Янв-07, 20:13 
>#define container_of(ptr, type, member) ({   \
>        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
>        (type *)( (char *)__mptr
>- offsetof(type,member) );})
>
>как понимать выражение ((type *)0)->member?
>и что такое __mptr?

"Защита от дурака". Точнее, от опечаток. Применение промежуточной переменной __mptr обеспечивает проверку на то что:
1. Поле member действительно есть в структуре типа type.
2. ptr действительно является указателем на структуру того же типа что и member.

>еще нашел,что такое offsetof
>#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

Ну, это совсем просто. Получается число - смещение поля MEMBER в структуре типа TYPE.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру