함수 포인터의 배열

4566 단어 CC언어 입문
마지막 기사의 유사한 문제.
변수 조작에 의해 실행하는 함수를 전환한다고 하는 것이 해결하고 싶은 문제.
예를 들어 아래 그림과 같이 FuncPtrArray [0]이면 함수 A가 실행되고 FuncPtrArray [1]이면 함수 B가 실행되는 상태.



구현



#include <stdio.h>

static void function_A(void){   printf("hello");  }
static void function_B(void){   printf("bye");    }
static int function_C(void){    return 1;   }

// 関数へのポインタを指し示す配列
void (* const FuncPtrArray[])(void) = {
    function_A,
    function_B,
    function_C,
};

int main(void)
{
    FuncPtrArray[0]();
    FuncPtrArray[1]();
    printf("%d", ((int (*)(void))FuncPtrArray[2])());
}

여기서 FuncPtrArray와 function_C는 형식이 다르므로 요주의.
처리계에 따라서는 올바르게 실행할 수 있을지도 모르지만, 아래와 같은 warning이 나올 것으로 보인다.
warning: initialization of 'void (*)(void)' from incompatible pointer type 'int (*)(void)'
{
    void (* pfunc)(void);

    pfunc = (void (*)(void))function_C;
    printf("%d", ((int (*)(void))pfunc)());
}

이렇게 구현하면 warning은 나오지 않지만, 변수 조작으로 전환한다는 목적을 달성할 수 없어~.
뭔가 좋은 방법이 있을까.

추가(20200514)



받은 코멘트를 바탕으로 코드를 수정했습니다.
@ 사이토와 아츠시 씨, @ @ 후지타 노조무 씨, 감사합니다.

좋은 웹페이지 즐겨찾기