반응형
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
반응형
'programing' 카테고리의 다른 글
mariadb의 "With As"를 변경하는 다른 방법 (0) | 2023.11.02 |
---|---|
선언은 Swift 1.2의 '최종' 오류와 '동적' 오류 모두일 수 없습니다. (0) | 2023.11.02 |
__sync_sync_sync_sync는 어떤 역할을 합니까? (0) | 2023.11.02 |
XML 구문 분석 - 요소트리 대 SAX 및 DOM (0) | 2023.11.02 |
Spring Security로 사용자 업데이트 시 권한을 다시 로드하는 방법 (0) | 2023.11.02 |