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용도로 넣었으며, 다른 딜레이 함수를 사용해도 무방합니다.