[완료] 구조체 안에서의 함수 포인터.
글쓴이: zipsinworm / 작성시간: 금, 2007/04/27 - 11:50오전
여러 소스를 보다보면 예를들어.
typedef struct _LIB_HANDLE_
{
.....
.....
.....
T_ALLOC Alloc;
DE_ALLOC Dealloc;
}
LIBHANDLE ;
이런 구조체가 있습니다. 궁금한건 T_ALLOC과 DE_ALLOC 입니다.
따라가서 찾아보니
typedef void* (*T_ALLOC)(unsigned long);
typedef void (*DE_ALLOC)(void*);
이렇게 정의가 되어 있었습니다.
제가 생각하기에는 함수포인터를 사용하는거 같은데 그럴려면 T_ALLOC함수와 DE_ALLOC함수가
존재 해야 하지 않나 생각됩니다. 근데 아무리 찾아봐도 위에 두 함수는 찾아볼 수가 없었습니다.
어떤 의미로 이 구조체를 쓰고 '') 저렇게 정의 하여 사용하는지 이해가 잘 안갑니다.
이런 문법도 존재하는지요..? 궁금합니다.
Forums:
Alloc와 Dealloc 두
Alloc와 Dealloc 두 변수가 가리키는 함수의 이름이 꼭 T_ALLOC 혹은 DE_ALLOC일 필요는 없습니다.
void * func(unsigned long ul)
void func(void * p)
이런 형태를 갖는 함수 모두를 가리킬 수 있습니다. 매개변수와 함수의 이름은 뭐든지 상관이 없습니다.
이런 말씀 드리면 실례가 될지 모르겠습니다만,
함수 포인터와 typedef에 대해서 아직 제대로 이해하지 못하신 듯 합니다.
책보고 기초 문법부터 다시 공부하세요.
쓰시는 C언어
쓰시는 C언어 매뉴얼에서 typedef 관련 부분을 찬찬히 읽어 보시기 바랍니다.
함수 프로토타입 선언에 대해 잘 기술 되어 있을 것입니다.
typedef void voidfn ();
voidfn fatal;
이런식의 이용이 가능 하지요.
그렇다면...
매개변수와 함수이름이 전혀 상관 없고 반환형이랑 매개변수 형만 같다라면 된다는건데 저런 구조체를 쓰는 이유는 뭘까요?
동적으로 필요한
동적으로 필요한 함수를 등록해서 사용하기 위해서 사용합니다.
콜백이나 플러그인과 같은 효과를 줄 때 유용합니다.
예를 들어 미디어 플레이어의 경우
이런식의 구조체를 정의해놓고 미디어 플레이어 초기화 시 각 코덱 dll에 있는 코덱 함수를 저 구조체 테이블에 등록시키면 나중에 파일의 타입을 확인해서 해당 코덱 타입에 맞는 함수를 호출하는 용도로 사용할 수 있습니다.
http://agbird.egloos.com
------------------------
http://agbird.egloos.com
잘 알겠습니다~
그렇군요. 어떤 여러 파일이 있다고 해서 각각 개별적으로 처리하는 것이 아니라 저런 구조를 이용함으로써 동적으로 핸들링 할 수 있군요.
감사합니다. 덕분에 정말 중요한 것을 알았습니다~ ^^
댓글 달기