рдпреВ-рдмреВрдЯ рдХреЗ рд╕рд╡рд╛рд▓ рдкрд░

рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░рдг рдЦреЛрдЬреЗрдВ рдФрд░ рдЖрдк рдмрд╣реБрдд рдХреБрдЫ рд╕рдордЭ рдЬрд╛рдПрдВрдЧреЗред


рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдПрд╕рдкреАрдЖрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдпреВ-рдмреВрдЯ рдХреЛрдб рдХреЛ рджреЗрдЦрдХрд░, рдореИрдВ рдЙрдкрд▓рдмреНрдз рдЙрдкрдХрд░рдгреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореИрдХреНрд░реЛ рдореЗрдВ рдЖрдпрд╛ рдерд╛, рдЬреЛ рдХрдИ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдХрдВрдЯреЗрдирд░_рдСрдл рдореИрдХреНрд░реЛ рдореЗрдВ рд░реАрд╕реЗрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИред рдореИрдХреНрд░реЛ рдЯреЗрдХреНрд╕реНрдЯ рд╕реНрд╡рдпрдВ рдореМрдЬреВрдж рдерд╛, рдФрд░ рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрдордп рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдЙрд╕ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рджреЗрдЦрд╛ рдерд╛ред рдПрдХ рдЫреЛрдЯреА рдЬрд╛рдВрдЪ рдХреА рдЧрдИ, рдЬрд┐рд╕рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдордиреЗ рдЖрдПред

рдореИрдХреНрд░реЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ рдЕрдЬреАрдм рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╕рдВрд░рдЪрдирд╛ (ptr) рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ, рд╣рдо рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ (рдкреНрд░рдХрд╛рд░) рдФрд░ рдХреНрд╖реЗрддреНрд░ (рд╕рджрд╕реНрдп) рдХрд╛ рдирд╛рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рдХрд┐ рдРрд╕рд╛ рдХрд╛рд░реНрдп рдХреИрд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рд╢рд╛рдпрдж рд▓реЗрдЦрдХ "рдХреБрдЫ рдЕрдЬреАрдм рдЪрд╛рд╣рддреЗ рдереЗ", рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдорд╛рдзрд╛рди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ:

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

рд╕рдм рдХреБрдЫ рдкрд╛рд░рджрд░реНрд╢реА рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдЦреЛрдЬрд╛ рдЧрдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдерд╛:

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

рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдкрд╣рд▓реЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдХреНрд░реЛ рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИ? рдирд╣реАрдВ, рдЬреЛ рдпрд╣ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╕рд┐рд░реНрдл рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИ: рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░рдВрддрд░ рд╕реНрдерд╛рдиреАрдп рд╕реВрдЪрдХ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдореИрдХреНрд░реЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рдЪрд╛рд░ рдореИрдХреНрд░реЛ рдХреЗ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢реИрд▓реА рдореЗрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ:

  int *x = (X) 

рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреБрдЫ рд╣рдж рддрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд▓реЗрддрд╛ рд╣реИ:

 typeof( ((type *)0)->member ) *__mptr = (ptr) 

рдЪреВрдВрдХрд┐ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдордХреНрдЦреА рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рд╕рд╣рдордд рд╣реИрдВ, рдмрд╛рдд рдЙрдкрдпреЛрдЧреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд╕рдВрдХрд▓рдХ рдЪреЗрддрд╛рд╡рдиреА рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред

рд▓реЗрдХрд┐рди рдХреЙрдиреНрд╕реНрдЯреЗрдВрд╕реА рд╕рдВрд╢реЛрдзрдХ - рдореИрдХреНрд░реЛ рдХреЛ рдЗрд╕ рдЬреЛрдбрд╝ рдХреЗ рдмрд┐рдирд╛ рднреА рдареАрдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдореИрдВрдиреЗ рддреБрд░рдВрдд рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛)ред рд▓реЗрдЦрдХ рдЗрд╕реЗ рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ рдЬреЛрдбрд╝ рдирд╣реАрдВ рд╕рдХрддреЗ рдереЗред

рд╡рд╣рд╛рдБ рджреЗрдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ
рдореБрдЭреЗ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ рдЬрд╡рд╛рдм рджрд┐рдпрд╛, рдореБрдЭреЗ рдЦреБрдж рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рдерд╛ред

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрд╢реЛрдзрдХ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдпрджрд┐ рд╣рдо рдирд┐рд░рдВрддрд░ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдХреЛ invalid conversion from 'const xxx*' to `xxx*' рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдВрджрд░ рдХреНрд╖реЗрддреНрд░ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рди рдХреЗрд╡рд▓ рдПрдХ рдореИрдХреНрд░реЛ рдореЗрдВ рдЬрд╝рдмрд░рджрд╕реНрддреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдирд┐рд░рдВрддрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рднреА рд╣рдЯрд╛ рджреЗрддреА рд╣реИ, рдЕрд░реНрдерд╛рдд:

 struct s1 { int data; const int next; }; const struct s1 ss1 = {314,0}; container_of(&(ss1.next),struct s1,next); 

рдореИрдХреНрд░реЛ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдФрд░ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рди, рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐:

 struct s1 { int data; int next; }; const struct s1 ss1 = {314,0}; container_of(&(ss1.next),struct s1,next); 

рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣реЗрдмрд░ рдХреЗ рдЙрди рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рднрд╛рд╖рд╛ рдХреЗ рдорд╛рдирдХ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдореЗрд░реА рдЦреЛрдЬ "рдереИрдВрдХ рдпреВ, рдХрдкреНрддрд╛рди" рдХреА рд╢реИрд▓реА рдореЗрдВ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рдкреНрд░рддреАрдд рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП рд╡реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi466905/


All Articles