C언어 Design Pattern - 함수 포인터

유명현·2022년 3월 28일

C언어 함수에도 주소가 있고 함수의 주소를 이용하여 포인터를 이용하여 함수에 접근하게 만들 수 있습니다.

void test(void)
{
	printf("test");
}
void test2(void)
{
	printf("test2");
}

void main()
{
	void (*test_function)(void);
    
    test_function = test;
    test_function();
    //test 함수 실행
    
    test_function = test2;
    test_function();
    //test2함수 실행 
}

위와같이 함수포인터를 선언하여 *test_function에 원하는 함수 주소를 넣어 여러 함수를 접근할 수 있게 만들었습니다.

함수포인터를 사용할 때 유의점은 함수의 형태(리턴값, 매개변수 자료형과 갯수)를 같게 만들어야 합니다. 이 유의점만 잘 지킨다면 모든 함수에 함수포인터를 만들고 사용할 수 있습니다.

함수포인터를 더 가독성을 높이기 위해 주로 typedef를 이용합니다.

typedef void (*test_fuction_t)(void);

static void test(test_function_t test_f);
static void callback(void);

void main()
{
	test (callback);
}

static void callback(void)
{
	printf("call back");
}

static void test(test_function_t test_f)
{
	while(1)
    {
    	test_f();
        for(int i = 0; i < 30000; i++)
        {
        	//delay 용도 
        }
    }
}

위의 test_fucntion_t을 typedef로 정의를 했습니다. test함수의 매개변수에 함수포인터를 자료형을 넣고 main문에 callback 함수의 주소를 넣습니다.

이렇게 하게 되면 main문에서 test 함수를 호출하게 되고 test함수 내에서 test_f은 callback 주소를 가르키기 때문에 callback함수를 호출하게 됩니다.

밑의 for문은 delay용도로 넣었으며, 다른 딜레이 함수를 사용해도 무방합니다.

profile
기억보다 기록을

0개의 댓글