[완료] typeof 연산자를 대체하려면 어떻게 해야 하나요?

pride4ever의 이미지

#define list_for_each_entry(pos, head, member) \
for( pos = list_entry((head)->next, typeof(*pos), member); \
&pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member) )

libusb를 arm에 포팅하고 있습니다.
컴파일러는 gcc가 아닌 armcc입니다.

컴파일 에러가 나길래 한참을 찾아보니 typeof가 원인이란걸 알았습니다.
(armcc는 typeof가 안되면 안된다고 하지 왜 이상한 에러를 낼까요..ㅡㅡ;)

찾아보니 typeof는 C 표준은 아니지만 gcc는 확장기능으로 제공한다고 하는군요.
armcc 는 이에 대한 자료가 없는걸로 보아 지원하지 않는것 같습니다.

그렇다면 저 코드를 어떻게 대체해야 할까요....?

에휴.... 산넘어 산이 끝없이 이어지네요.

감사합니다.

empty2fill의 이미지

*pos의 실제 타입을 list_entry의 두 번째 인자에 하드 코딩으로 적어주시면 될 것 같습니다.

매크로는 타입마다 새로 정의해서 사용하시구요(list_for_each_entry_typed)

예를 들어 *pos 타입이 int형이면

#define list_for_each_entry_int(pos, head, member)	 \
for( pos = list_entry((head)->next, int, member);	\
&pos->member != (head);	 \
pos = list_entry(pos->member.next, int, member) )

이렇게요.

——
———
Life is a tragedy when seen in close-up, but a comedy in long-shot. - Chaplin, Charlie -

bushi의 이미지

그냥... list_for_each_entry() 사용하는 곳을 모두 찾아서, 그 바로 앞에

#undef typeof
#define typeof(_x_) struct xxx _x_
pride4ever의 이미지

http://buzzan.thoth.kr/?mid=blog&document_srl=1935095

좀더 찾아보니 위에 정보가 있네요.
offsetof를 이용해서 바꿔주고 empty2fill 님 말씀처럼 구조체명을 하드코딩으로 적어줬더니 컴파일 됩니다.

과연 저게 동작할런지는.....^^

답글 달아주신 분들 고맙습니다.