[질문] 함수 포인터 사용에 관해 궁금한 게 있어요
현재 임베디드 관련 개발 키트를 구매하여 그 소스를 받아서 분석을 하다가 함수 포인터와 관련해서 질문이 생겨서 올리게 되었습니다.
소스는 약 20개 정도의 *.h, *.c 파일로 구성되어 있으며, 딱 1개의 소스 파일(r.c)만 libr.a 라는 아카이브 파일 형태로 제공되었습니다.
(해당 파일의 소스는 공개할 수 없답니다)
그런데 바로 그 libr.a 라는 파일에 정의되어 있는 함수(rInit)를 호출할 때 인자로 함수 포인터(fptr)를 넘기더군요.
(참고로 분석하던 소스 전체에서 함수 포인터를 쓴 곳은 여기밖에 없습니다)
그래서 왜 저 부분만 함수 포인터로 함수를 넘길까? 고민해 봤는데 잘 모르겠네요 ㅠㅠ
참고로 위에서 언급했다 시피 아래의 r.c 라는 파일은 주어지지 않은 상태라고 가정합니다.
r.h, libr.a는 주어지지만 r.c 라는 소스 파일은 주어지지 않은 상황입니다.
r.h
void rInit(void (*f1)());
r.c - 주어지지 않은 소스 파일이지만 이렇게 생겼다고 가정
void rInit(void (*f1)()) { printf("rInit\n"); f1(); }
n.h
void nInit();
n.c
void nInit() { printf("nInit\n"); }
main.c
#include "r.h" #include "n.h" ... int main() { void * fptr = nInit; rInit(fptr); return 0; }
위의 파일들을 아래와 같이 build 합니다.
gcc -c r.c n.c main.c ar r libr.a r.o gcc -o main main.o n.o -L. -lr
위에서 보면 r.c 에서 n.h 파일을 include 해서, rInit() 함수 안에서 nInit() 함수를 호출해도 될 듯 한데,
굳이 nInit() 함수의 function pointer를 rInit() 함수의 인자로 넘겨준 이유가 무엇인지 궁금합니다. ^^
왜 꼭 함수 포인터를 사용했을까? 라고 생각을 하니 어떤 특별한 이유가 있을 것도 같은데 정확히는 모르겠습니다.
혹시 libr.a 의 소스 공개를 꺼려하던 것과 관련이 있을까요?
어차피 libr.a의 소스를 주지 않았다면, 함수 포인터를 쓰던지 안 쓰던지 간에 별 상관 없을거 같은데 말이지요.
그럼 고수님들께 미리 감사드리면서...열심히 공부하겠습니다. ㅠㅠ
자세한 소스가
자세한 소스가 없어서 대충 추측밖에 할 수 없습니다만,
"저쪽(라이브러리)에서 부르는 것과 이쪽(라이브러리 사용 소스)에서 부르는 것의 차이"로 접근하셔야할 듯합니다.
즉, 라이브러리 쪽에서 function pointer를 인자로 받아 초기화 함수를 호출한다면, 유저의 함수 실행후에 후처리를 할 수 있듯합니다.
초기화가 적절히 이루어졌는지(예를 들자면 전역변수 초기화 같은 것들)를 검사할 수도 있고, 유저의 초기화 함수의 결과에 따라 시간적으로 나중에 이루어져야할 라이브러리의 초기화를 할 수도 있을 거같군요.
아무래도 callback 형태로 처리하지 않으면 이런 후처리의 부담이 라이브러리의 사용자 쪽으로 전가(?)되겠죠.
이상으로 추측 및 상상을 마칩니다. -_-;;
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
댓글 달기