함수 포인터의 배열
변수 조작에 의해 실행하는 함수를 전환한다고 하는 것이 해결하고 싶은 문제.
예를 들어 아래 그림과 같이 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)
받은 코멘트를 바탕으로 코드를 수정했습니다.
@ 사이토와 아츠시 씨, @ @ 후지타 노조무 씨, 감사합니다.
Reference
이 문제에 관하여(함수 포인터의 배열), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sunadandy/items/e484e1161144bf76e2ad텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)