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 처리

대부분 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
⚠️ **GitHub.com Fallback** ⚠️