programing

linux/list.h의 macro의 container_뒤에 있는 이론적 근거

muds 2023. 11. 2. 22:09
반응형

linux/list.h의 macro의 container_뒤에 있는 이론적 근거

리눅스 커널 목록의 구현에서/include/linux/list.h, (아래 붙여넣기)의 첫 번째 줄 뒤에 있는 근거는 무엇입니까?container_of거시적?

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

나의 샘플 코드에서 나는 이 줄을 제거하고 정의를 다음으로 변경했습니다.

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

제 코드는 여전히 기대했던 결과를 보여줬습니다그럼 첫번째 줄은 중복인가요?아니면 제가 모르는 숨겨진 함정이 있는 건가요?

FAQ/LinkedLists에서 찾은 코드

/**
 * container_of - cast a member of a structure out to the containing structure
 * @ptr:        the pointer to the member.
 * @type:       the type of the container struct this is embedded in.
 * @member:     the name of the member within the struct.
 *
 */
#define container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

유형 확인 기능이 추가됩니다.버전을 사용하면 경고 없이도 다음을 컴파일할 수 있습니다.

struct foo { int bar; };

....

float a;
struct foo *var = container_of(&a, foo, bar);

커널 버전에서 컴파일러는 다음과 같이 보고합니다.

warning: initialization from incompatible pointer type

매크로가 어떻게 작동하는지에 대한 좋은 설명: 그렉 크로아-하트만의 컨테이너.

언급URL : https://stackoverflow.com/questions/6083734/rationale-behind-the-container-of-macro-in-linux-list-h

반응형