По Вопросу U-Boot



Найди всему причину и ты многое поймешь Недавно, просматривая код U-Boot относительно реализации SPI, я наткнулся на макрос обхода списка доступных устройств, который после нескольких переходов сбрасывал меня на макросContainer_of. Текст самого макроса присутствовал и я был слегка удивлен, увидев, что он несколько отличается от той версии, которую я видел ранее.

Было проведено небольшое расследование, которое привело к интересным результатам.

Сам макрос известен давно и решает несколько странную задачу: у нас есть указатель на поле некоторой структуры (ptr), мы знаем тип структуры (type) и имя поля (member) , и нам нужно получить указатель на структуру в целом.

Я не очень понимаю, как могла возникнуть такая проблема; возможно, авторы «хотели чего-то странного», но раз задача поставлена, ее надо решить.

Решение известно:

  
   

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

Все прозрачно и понятно, но обнаруженная реализация оказалась несколько сложнее:

#define container_of(ptr, type, member) ({

Теги: #программирование #макросы
Вместе с данным постом часто просматривают: