container_of

  1. #include <assert.h>
  2.  
  3. #define container_of(ptr, type, member) \
  4.   ((type *)((char *)(ptr)-(char *)(&((type *)0)->member)))
  5.  
  6.  
  7. struct child {
  8.     int id;
  9. };
  10.  
  11. struct parent {
  12.     int id;
  13.     struct child child;
  14. };
  15.  
  16. int main(int argc, char** argv)
  17. {
  18.     struct child   child   = {2};
  19.     struct parent  parent  = {1, child};
  20.     struct child  *p_child = &parent.child;
  21.     struct parent *p_parent;
  22.  
  23.     p_parent = container_of(p_child, struct parent, child);
  24.     assert(p_parent->id == 1);
  25.     return 0;
  26. }
container_of позволяет получить указатель на структуру, содержащий заданный элемент, поэтому в примере хранить указатель на родителя в структуре child не нужно.

Реклама

Мы в соцсетях

tw tg yt gt