[완료]pointer to function
글쓴이: puresupe / 작성시간: 화, 2008/09/30 - 9:16오후
TCPL 2nd. 119페이지를 보다가 stdlib.h에 있는 void qsort(void *v[], int left, int right, int (*comp)(void *,void *))를 사용하는 예제를 봤는데요
실제로 소스에선
qsort((void **)lineptr, 0, nlines-1, (int (*)(void*,void*)(numeric? numcmp : strcmp));
이렇게 사용하더라구요. numeric 값에따라서. 비교함수를 numcmp()를 사용할것인지 strcmp()를 사용할것인지 선택하게끔하는부분이지요.
위 qsort() 호출에서 (int (*)(void*,void*)) 이부분을 모르겠더라구요.
만약에. strcmp함수를 호출할거면. 그냥 strcmp만 써주만 되지 않나여?
책에서설명이 깊지 않아서 여쭙습니다. 덜덜덜..
Forums:
포인터 타입 캐스팅이네요.
타입 캐스팅이라고 생각하시면 됩니다.
int strcmp(const char *s1, const char *s2); 이 int cmp( void *, void * ); 랑 맞지 않아서 강제로 캐스팅을 하는거네요.
다음 typedef 가 있다고 치면 이해하시기 편할꺼 같네요.
/* 리턴타입이 int이고 인자를 (void *, void *)를 받는 함수 포인터 타입을 ptr_cmp로 정의합니다. */
typedef int (*ptr_cmp)(void *,void *) ;
qsort함수가 다음과 같은 거겠죠?
void qsort(void *v[], int left, int right, ptr_cmp cmp);
그러면 실제 호출부분은 다음과 같이 된다고도 볼 수 있겠죠 ^^:
qsort((void **)lineptr, 0, nlines-1, ((ptr_cmp)(numeric? numcmp : strcmp));
타입 캐스팅입니다
typedef int (*compfunc)(void *, void *);
라는 typedef가 있다고 생각하면 위 코드는
qsort((void **)lineptr, 0, nlines-1, (compfunc)(numeric? numcmp : strcmp));
와 동일합니다.
qsort가 요구하는 type이 'int (*)(void *, void *)' 인데
strcmp는 'int (*)(const char *, const char *)' 니까
타입 캐스팅이 없다면 warning이나 error가 뜰 듯 합니다.
답변 감사합니다. :D
답변 감사합니다. :D
댓글 달기