언어/C
offsetof macro 와 container_of macro
DangDang's
2019. 4. 6. 16:58
먼저 offsetof 매크로 먼저 살펴볼게요.
offsetof 매크로는 아래와 같이 정의되어 있어요.
#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER)
offsetof는 커널에서 double linked list 관련 소스를 볼 떄 접할 수 있어요. 그 외에도 다양한 곳에서 자주 사용되요.
offseetof는 표준 라이브러리 <stddef.h>가 include 하게 되면 사용할 수 있고, 이 매크로를 이용해서 특정 구조체 멤버의 offset을 구할 수 있어요.
그 다음으로 container_of 매크로를 살펴볼게요.
container_of 매크로는 디바이스 드라이버 작업을 하다 보면 자주 보게 되는 매크로라고 해요.
container_of 매크로는 아래와 같이 정의되어 있어요.
#define container_of(ptr, type, member) ({
const typeof(((type *)0)->member) * __mptr = (ptr);
(type *)((char *)__mptr - offsetof(type, member)); })
이 매크로의 인자를 한번 확인해 볼게요.
prt : 임의의 포인터 값
type : ptr을 멤버로 갖는 자료구조형
member : 자료구조형에서 ptr의 멤버 이름
container_of는 자료구조의 멤버의 ptr, ptr을 멤버로 갖는 자료구조의 type, 자료구조형에서 ptr의 멤버이름을 알고 있다면 구하고자 하는 자료구조의 위치를 구할 수 있는 매크로입니다.