#include <stddef.h>가 필요하다.
(size_t)offsetof(type, member)는 type에 해당하는 structure의 시작으로부터 해당 member까지의 offset을 구해준다.
이것을 이용해서 받은 인자가 속한 structure의 instance(정확한 표현은 아닌 것 같지만)를 쉽게 알아낼 수 있다. 예를 들어,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
struct foo { int a; int b; }; struct foo str_a, str_b; #define GET_CONTAINER(type, member) \ (&member - offsetof(type, member)) void boo(int *p) { struct foo *str_p; str_p = (struct foo *)GET_CONTAINER(struct foo, *p); /* str_p == str_a */ } |
boo에게는 str_a에 대한 정보가 주어지지 않았지만 str_a에 있는 다른 변수들에 접근할 수 있게 된다.