앞서 작성했던 예제를 함수 포인터 배열을 이용해서 간결하게 만들어 보자. (=조건문을 없애보자.)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define print_func_name (printf("%s%s\\r\\n", __func__,"()"))
void zero() { print_func_name; }
void one() { print_func_name; }
void two() { print_func_name; }
void three() { print_func_name; }
void four() { print_func_name; }
void five() { print_func_name; }
void six() { print_func_name; }
void seven() { print_func_name; }
void eight() { print_func_name; }
void nine() { print_func_name; }
int main() {
char key = 0;
int dummy = 0;
printf("Enter a number between 0 to 9: ");
dummy = scanf("%c", &key);
#define MAX_FUNC_CNT (10)
void (*fp_arr[MAX_FUNC_CNT])() = {
zero, one, two, three, four, five, six, seven, eight, nine,
};
unsigned int index = (unsigned int)(key - 0x30);
(*fp_arr[index])();
return 0;
}
좌측의 조건문이 우측과 같이 한줄의 코드로 대체되면서 조건문이 사라졌다.
코드가 매우 간결해졌다.
switch (key) {
case '0': zero(); break;
case '1': one(); break;
case '2': two(); break;
case '3': three(); break;
case '4': four(); break;
case '5': five(); break;
case '6': six(); break;
case '7': seven(); break;
case '8': eight(); break;
case '9': nine(); break;
}
(*fp_arr[key-0x30])();
조건문이 있었는데, 사라졌습니다.
이는 상당히 중요한 기법이므로 잘 익혀두기 바란다.
위와 같이 조건문이 명약관화한 경우
딱히 함수 포인터 배열의 장점을 느낄수 없을지도 모른다.