C 함수 포인터 반환값 - sonkoni/Koni-Wiki GitHub Wiki
C언어는 함수의 반환값을 반환형으로 싸서 주는 형태를 취한다. 즉, 내부의 함수블럭을 먼저 실행한 다음 반환형에 캐스팅 하는 형태이다. 이런 측면으로 이해하면 아래 선언된 함수포인터 반환값 형태가 이해된다.
== 선언 ==
함수포인터반환값자료형 (*함수이름(매개변수자료형 매개변수))(함수포인터매개변수자료형1, 함수포인터매개변수자료형2, ...)
=======================
=================== 함수 본체 선언 ==============================================
└────────────────────┬───────────────────────────────────┘
함수 본체에서 반환되는 함수포인터
== typedef 처리 ==
typedef 반환값자료형 (*함수포인터별칭)(매개변수자료형1, 매개변수자료형2, ...);
반환값함수포인터별칭 함수이름(매개변수자료형 매개변수, ...) {... 함수구현...}당나라 문법처럼 보여서 안 쓸 것 같지만, 내부 함수를 캡슐화시키기 위해 정말 자주 쓰인다.
#include <stdio.h>
int Add(int a, int b) {
return a + b;
}
int Mul(int a, int b) {
return a * b;
}
int (*GetCalc(_Bool isMul))(int, int) {
return isMul ? Mul : Add; // Mul이나 Add 의 메모리 주소 반환
};
int main(int argc, char *argv[]) {
int result = GetCalc(0)(10, 5);
printf("=> %d", result);
return 0;
}
// => 15대부분 typedef 처리를 한다. 이렇게 안 쓰면 지저분해서 코드를 읽기가 힘들기 때문이다.
#include <stdio.h>
typedef int (*CalcFunc)(int, int);
int Add(int a, int b) {
return a + b;
}
int Mul(int a, int b) {
return a * b;
}
CalcFunc GetCalc(_Bool isMul) {
return isMul ? Mul : Add;
};
int main(int argc, char *argv[]) {
CalcFunc fp = GetCalc(1);
int result = fp(10, 5);
printf("=> %d", result);
return 0;
}
// => 50