2014-09-02 4 views
1

인수에 struct 유형을 전달하는 방법은 무엇입니까? 나는 그것이 가능하지 않다고 생각하지만 여전히 가능한지 확인하고 싶었다.인수에 struct 유형을 전달하는 방법은 무엇입니까?

내 요구 사항이

같은 것이 아래

#define list_entry(ptr, type, member) \ 
    ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) 

내가 기능을 사용하여 재 작성하려는 리눅스 커널에 사용되는 매크로 list_entry입니다. 어떻게 쓸 수 있습니까?

list_entry(void *ptr, ???, ???) 

우리가이 작업을 수행 할 수있는 방법이 있습니까?

주어진 목록을 해제하는 래퍼를 작성하려고합니다. 그래서 내 함수에서 list_entry를 사용하려면, 내 함수는 type과 멤버와 함께 전달되어야합니다. 가능한가?

답변

2

동일한 동작 및 서명을 사용하여 list_entry을 작성하는 것은 근본적으로 불가능합니다. 이는 인수에 유형 및 멤버 이름이 포함되어 있고 어느 값도 C 값이 아니기 때문입니다.

반면에 매크로의 "코드"내용을 함수로 추상화 할 수 있습니다.

#define list_entry(ptr, type, member) \ 
    ((type *)f_list_entry(ptr, offsetof(type, member))) 

static void *f_list_entry(void *ptr, size_t offset) 
{ 
    return (char *)(ptr)-offset; 
} 

그러나 알 수 있듯이 실제 "코드"는 하나의 빼기입니다. 차라리 가난한 해킹을 통해 정의되지 않은 동작의 커널의 호출보다는 매크로 표준 offsetof을 사용하기 때문에

, 나는 또한 형식 정확성 (대신 unsigned longsize_t)를 고정의 자유를했다.

+0

감사합니다 R .. 훌륭한 아이디어 .. !!! –

관련 문제