2011-02-14 2 views
0

List.h는 container_of() 함수의 래퍼 인 list_entry라는 매크로를 정의합니다. 매우 민감한 것 같다 우아한 기능 : Container_of() 컴파일하지 않음

코드의이 부분을 고려
tmp = list_entry(pos,(struct Order),ord_Queue); 

내가 GCC를 사용하여 컴파일

이 예상 표현의 지속적인 오류가 팝업됩니다. 그것은 container_of에 문제가 ARG2와에서 arg3에 사용 불필요한 괄호가있는 경우가 있고,에서 arg1 예의 here에 대해 하나 개의 브라켓이 있어야한다 보인다

struct Order 
     { 
     double idNum; 
     char* entryTime; 
     char* eventTime; 
     struct list_head ord_Queue; 
     }; 

:로

내 구조가 정의된다. 나는 그것을 시도했지만, 그것이 작동하지 않습니다.

일부 도움을 주시면 감사하겠습니다.

+0

컴파일러가 말한 것처럼 Order 구조체는 표현식이 아니므로 임의로 (및) 둘러싸여서는 안됩니다 (컨텍스트에서 -). 함수 또는 매크로에 매개 변수를 제공하는 것 - 서브 표현식을 그룹화하는 데에만 사용됩니다. –

+0

예, 처음부터 정확하게 시작했지만 불만을 토로했습니다. 위에서 주어진 링크를 읽은 후 대괄호를 추가했습니다. 아직도 컴파일을하지 못했습니다. 결국, 나는 전체 매크로를 없애고 (고정 된 데이터 타입을 사용하는) 문제를 위해 같은 테일 모드를 사용해 보았지만 여전히 제대로 컴파일하지 못했습니다. 결국 프리 페치에 문제가 발생했습니다. 그래서 네가 생각할 수있는 가능성의 전체 스펙트럼을 시도했다. (흥미롭게도, 매크로를 사용하지 않고 코드에서 그 정의를 사용했을 때, 컴파일러는 모든 것이 괄호로 묶이지 않을 때까지 계속 불평했다) – Soham

답변

2

아마도 커널에서 복사했을 때 list.h에 오류가 있습니까? (여기에서 사용자 공간 프로그램을하고 있다고 가정하십시오.) 예제 코드가 잘 알려진 구현으로 컴파일되기 때문입니다.

#include <libHX/list.h> 
struct order { 
     struct HXlist_head ord_queue; 
}; 
int main(void) { 
     struct HXlist_head *pos; 
     struct order *o = HXlist_entry(pos, struct order, ord_queue); 
} 
+0

나는 list.h를 생각하지 않는다. 그 자체로 문제는 있지만, 백 캐스팅과 관련하여 분명히 문제가 있습니다. – Soham

2

내부적으로 container_of()가 사용하는 "offsetof"매크로가 누락되었다고 생각합니다. 코드를 다음 (대신 전체는 list.h 포함을 포함하여보십시오

#include <sys/types.h> 
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 
#define container_of(ptr, type, member) ({      \ 
      const typeof(((type *)0)->member) *__mptr = (ptr); \ 
      (type *)((char *)__mptr - offsetof(type,member));}) 

#define list_entry(ptr, type, member) \ 
    container_of(ptr, type, member) 

struct list_head { 
    struct list_head *next, *prev; 
}; 

그리고 두번째 인수에 여분의 괄호를 추가 할 필요, 그것없이 잘 작동합니다. 나는이 일을해야 희망 가 없습니다.

+0

나는 container_of를 직장 동료에게 설명해야했고 이것이 도움이되었다. (컴파일 오류가 발생했습니다 "오류 : 예상 식 'struct'전에"offsetof 및 sys/types.h 헤더 파일을 고정 매크로 고치기. 고마워! – chronodekar