2015년 8월 27일 목요일

C 언어 - 함수 포인터

함수 포인터를 이용해 더욱 확장성 있는 프로그램을 만들 수 있다.

콜백 함수


함수도 주소가 있다.
함수 주소값을 다른 모듈에 넘겨주고 필요한 경우 호출하도록 할 수 있다.

callback.c


디버그 모드 일때만 로그를 출력하는 프로그램

#include <stdio.h>
#include <string.h>
typedef void (*prototype_callback_log)(const char * message);
static void s_callback_log_verbose(const char * message) {
    printf("LOG: %s\n", message);
}
static void s_callback_log_silent(const char * message) {
    // do nothing
}
static void s_run(prototype_callback_log log) {
    log("Program Begin");
    log("Program End");
}
int main(int argc, char * args[]){
    prototype_callback_log log;
    if (argc > 1 && !strcmp(args[1], "debug")) {
        printf(" == DEBUG MODE ==\n");
        log = s_callback_log_verbose;
    } else {
        printf(" == RELEASE MODE ==\n");
        log = s_callback_log_silent;
    }
    s_run(log);
    return 0;
}


실행:
$ ./callback
 == RELEASE MODE ==
$ ./callback debug
 == DEBUG MODE ==
LOG: Program Begin
LOG: Program End


Interface


위 예제의 함수 prototype 부분을 헤더 파일로 이동하여 프로젝트 전반에 걸쳐 공유할 수 있다.
여러 모듈간 데이터가 오가는 경우 미리 함수 prototype 을 지정하게 되면 각자 모듈을 구현하는데 고민할 부분이 한정되어 충돌없이 동시에 각자의 모듈을 구현할 수 있다.

Interface 라는 말은 함수 prototype 만을 지칭하는 용어는 아니고 미리 통신 방식이나 주고 받을 데이터 규약을 통칭한다.

Interface 를 정의할 때는 간략하고 필요한 데이터만 정의하도록 한다.
충분한 구현 경험이나 이해없이 좋은 interface 를 정하기는 어렵다.

결과물에 대한 그림이 머리속에 그려질 수 있어야 한다.

댓글 없음:

댓글 쓰기