Найди всему причину и ты многое поймешь Недавно, просматривая код 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) ({
Теги: #программирование #макросы
Вместе с данным постом часто просматривают:
-
Rss На Apple Tv
19 Oct, 24 -
Осторожно, Комиссия!
19 Oct, 24 -
Давайте Поиграем В Городах
19 Oct, 24 -
Microsoft Поможет Найти Ошибки В Oss
19 Oct, 24 -
Алгоритмы Сжатия Данных Без Потерь
19 Oct, 24 -
Вы Уже Используете R В Бизнесе?
19 Oct, 24 -
Утечка Памяти С Помощью Threadlocal
19 Oct, 24