카테고리 없음
C언어_함수 포인터를 이용한 API 설계
WorkKing
2022. 3. 21. 10:08
int add(int num1, int num2){
return num1 + num2;
}
int sub(int num1, int num2){
return num1 - num2;
}
int multi(int num1, int num2){
return num1 * num2;
}
int (*func)(int, int);
int main(int argc, char ** argv){
func = add;
fprintf(stdout, "add(2,3) : %d\n", func(2,3));
func = sub;
fprintf(stdout, "sub(2,3) : %d\n", func(2,3));
func = multi;
fprintf(stdout, "multi(2,3) : %d\n", func(2,3));
func = *add;
fprintf(stdout, "*add(2,3) : %d\n", func(2,3));
}
[결과 분석]
다음과 같이 함수의 prototype가 같을 때, 함수 포인터를 이용하여 함수의 주소를 넘겨 받아 함수를 이용할 수 있다.
main문에서 func에 add를 주거나 sub를 넘겨주게 되면 앞서 설명한대로 func이 해당 함수의 주소로 넘어가 기능을 수행하게 된다.
func에 함수의 주소를 넘겨줄 때 포인터를 이용해 넘겨주어도 정상적으로 수행하는 것을 확인하였다.
void add(int num1, int num2, int *rst){
*rst = num1 + num2;
}
void sub(int num1, int num2, int *rst){
*rst = num1 - num2;
}
void multi(int num1, int num2, int *rst){
*rst = num1 * num2;
}
void (*func[3])(int, int, int*) = {add, sub, multi};
int main(int argc, char ** argv){
int ans;
for(int i=0;i<3;++i){
func[i](2,3, &ans);
fprintf(stdout, "result func[%d]: %d\n", i, ans);
}
}
[결과 분석]
이번에는 포인터 배열 형식으로 각각의 함수 주소를 저장해 놓은 배열을 생성하여 출력하는 예제이다.
각각의 함수의 결과는 매개변수로 넘겨주어 결과값으로 출력해보았다.
함수에서 결과 값이 하나이면 리턴 타입을 해당 결과 타입으로 설정하면 되지만,
결과 값이 2개 이상이거나 해당 결과 값을 함수 내에서 계속 처리해야하는 경우
함수 파라미터로 값을 넘겨 결과 값으로 출력하는 게 좋을 거 같다.