반응형
C언어에서 사용하는 가장 어려운 것 중에 하나인 함수 포인터 배열,
실제 코드를 보면서 분석을 해보려고 한다. 3개의 파일로 구성되어 있고,
function_test.c 에서 실제 코드를 실행하고
func.c 와 func.h 에서 코드가 구현 되어 있다.
/* func.c */
#include "func.h"
void print1(void){
printf("function name : %s\n", __func__);
}
void print2(void){
printf("function name : %s\n", __func__);
}
void print3(void){
printf("function name : %s\n", __func__);
}
void print4(void){
printf("function name : %s\n", __func__);
}
void print5(void){
printf("function name : %s\n", __func__);
}
간단한 함수 5개가 구현되어 있다.
각각의 함수는 __func__ 라는 자기 자신의 함수 이름을 출력한다.
구현된 모양이 비슷하기 때문에 함수 포인터 배열로 사용하기 좋다.
/* func.h */
#ifndef FUNCTION_TEST
#define FUNCTION_TEST
#include <stdio.h>
void print1(void);
void print2(void);
void print3(void);
void print4(void);
void print5(void);
typedef enum{
PRINT1,
PRINT2,
PRINT3,
PRINT4,
PRINT5
}PRINT_FUNC;
void (*PRINT_FUNCTION[5])(void);
#endif // !FUNCTION_TEST
header 파일에서 각각의 함수를 선언하고,
typedef enum 으로 PRINT1 = 0 ~ PRINT5 = 4 로 간단하게 타입을 만들었다.
그리고 각 함수를 대변할 함수 포인터를 만든다.
[함수 포인터 만드는 법]
실제 동작을 하는 함수의 선언부를 가져온다.
(아래 2개의 예시를 본다.)
void print1(void);
int calc_sum(int a, int b);
함수의 이름부분을 괄호로 감싸고, 포인터처리해준다.
void (*print1)(void);
int (*calc_sum)(int a, int b);
원래 있던 이름 대신 대표되는 이름으로 바꿔준다.
void (*prt)(void);
int (*sum)(int a, int b);
배열이라면 [숫자] 를 추가한다.
void (*prt[5])(void);
int (*sum[5])(int a, int b);
이렇게 만들어진 함수를 아래와 같이 실제 사용할 수 있다.
/* function_test.c */
#include <stdio.h>
#include "func.h"
void main(){
printf("start of program\n");
for (int i = 0; i <= 4; i++){
PRINT_FUNCTION[i]();
}
printf("\n");
for (PRINT_FUNC i = PRINT1; i <= PRINT5; i++){
PRINT_FUNCTION[i]();
}
}
예제에서는 for 문으로 인수를 돌리면서 사용했지만,
실제 코드에서는 PRINT_FUNCTION[숫자](); 의 형식으로 숫자만 바꿔가며
알맞은 함수를 불러오면 될것이다.
반응형
'C언어' 카테고리의 다른 글
[C언어] 2차원 배열 파라미터(매개변수)로 넘기기 (0) | 2023.02.14 |
---|---|
[C언어] 구조체 초기화하는 방법 (0) | 2023.02.07 |
[C언어] 문자열, string 사용하는 방법 (0) | 2023.01.31 |
[C언어] 함수포인터, function pointer 사용법 (0) | 2023.01.27 |
[C언어] Switch 문의 사용법과 주의사항 (0) | 2023.01.13 |
댓글