먼저 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의 멤버이름을 알고 있다면 구하고자 하는 자료구조의 위치를 구할 수 있는 매크로입니다.
'언어 > C' 카테고리의 다른 글
삽입 정렬(insertion sort) (0) | 2019.04.06 |
---|---|
선택 정렬(selection sort) (0) | 2019.04.06 |
버블 정렬(bubble sort) (0) | 2019.04.06 |
C/C++의 const(상수) (0) | 2019.04.01 |