1. callback
- 라이브러리 에서 우리가 만든 함수를 호출하는 경우...
- 이렇게 역방향으로 호출되는 함수를 Callback 함수라고 한다.
- 예를 들어 라이브러리에 생일축하 노래불러주는 함수가 있다고 해보자.
- 사랑하는 땡땡땡~ 이부분은 우리의 목소리를 넣고 싶다.
- 그러면, 땡땡땡에 무엇을 넣어야할지를 라이브러리에 알려주기 위해,
- 만드는 함수가 Callback 함수이다.
- 우리는 callback 함수를 만들고 , 이 힘수의 포인터를 라이브러리에 알려주면,
- 라이브러리는 땡땡땡이 나오는 순간, Callback 함수를 호출하여 생일축하 노래를 완성한다.,
- 그 예로 표준함수중, 데이터를 정렬하는 기능을 수행하는 qsort()가 있다.
- 퀵소트 함수인데.
- 데이터타입은 개발자가 정할 수 있다.
- 그래서 데이터를 비교하는 기능은 개발자가 Callback 함수로 만들어 라이브러리에 제공하도록 하였다.
- 정렬시 어떤 데이터가 앞으로, 어떤 데이터가 뒤로 갈지를 라이브러리에서 결정하는 것이 아니라, 개발자가 정한다.
- 이렇게 하면 기본 데이터 타입 뿐 아니라 , 개발자가 정의 한 구조체에 대해서도 정렬을 할 수 있고, 오름 차순인지, 내림차순정렬인지 등을 개발자 마음대로 변경할 수 있어 유연성이 엄청나게 증가한다.
#include <stdio.h>
#include <stdlib.h>
#define NUM 10
int ascending(const void*a , const void*b)
{
if (*(int*) a > *(int*) b)
return 1;
else if (*(int*) a < *(int*) b)
return -1;
else
return 0;
}
int descending(const void*a , const void*b)
{
if (*(int*) a < *(int*) b)
return 1;
else if (*(int*) a > *(int*) b)
return -1;
else
return 0;
}
void output(int *data, int size)
{
for (int i=0; i<size; i++)
printf("%d ", data[i]);
puts("");
}
void main()
{
int data[NUM]= { 10,20,30,40,9023,1231,2345,343,123,532 };
qsort(data, NUM, sizeof(int) , ascending);
output(data, NUM);
qsort(data, NUM, sizeof(int) , descending);
output(data, NUM);
}
#include <stdio.h>
void test_func(void (*func)(int aa,int bb), int a, int b)
{
printf("I am Test Function\n");
func(a, b);
}
void call_back_func_1(int a, int b)
{
printf("I am CallBack Function1 -- a=%d,b=%d\n", a,b);
}
void call_back_func_2(int a,int b)
{
printf("I am CallBack Function2 -- a=%d,b=%d\n", a,b);
}
int main(int argc, char **argv)
{
int answer1;
int answer2;
if (argc != 3) {
printf("err argc = %d\n",argc);
return -1;
}
answer1 = atoi(*(argv + 1));
answer2 = atoi(*(argv + 2));
switch (answer1)
{
case 1:
test_func(call_back_func_1, answer1,answer2);
break;
case 2:
test_func(call_back_func_2, answer1,answer2);
break;
}
return 0;
}