본문 바로가기
C언어

[C언어] 함수 포인터 배열, 실제 코드로 알아보자

디지털노마드 2023. 1. 31.
반응형

 

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[숫자](); 의 형식으로 숫자만 바꿔가며 

알맞은 함수를 불러오면 될것이다. 

 

 

반응형

댓글