跳转表就是一个函数指针数组。
创建一个跳转表需要两个步骤。
1、首先,声明并初始化一个函数指针数组,唯一需要留心之处就是确保这些函数的原型出现在这个数组的声明之前
2、使用下面的语句替换 switch 语句:
result = switch_table(num)(value1, value2);
num:用于从数组中选择正确的函数指针,而函数调用操作符将执行这个函数。
value1、value2用于向跳转跳函数传递参数。
#include <stdio.h>
#include <stdlib.h>
#define FUNCTION_JUMP 1
typedef enum
{
OP_ADD = 0,
OP_SUB,
OP_MUL,
OP_DIV,
INVALID = 0xff,
}OP_TYPE;
double ADD(double para1, double para2)
{
return para1 + para2;
}
double SUB(double para1, double para2)
{
return para1 - para2;
}
double MUL(double para1, double para2)
{
return para1 * para2;
}
double DIV(double para1, double para2)
{
return para1 / para2;
}
#if (FUNCTION_JUMP == 0)
double fun_caluc(int flag, double para1, double para2)
{
double result = 0;
switch(flag)
{
case OP_ADD:
{
result = ADD(para1, para2);
break;
}
case OP_SUB:
{
result = SUB(para1, para2);
break;
}
case OP_MUL:
{
result = MUL(para1, para2);
break;
}
case OP_DIV:
{
result = DIV(para1, para2);
break;
}
default:
printf("can not find you \n");
result = 0xff;
break;
}
return result;
}
#endif // FUNCTION_JUMP
#if (FUNCTION_JUMP == 1)
typedef double (*OP_FUN)(double para1, double para2);
/*重定义了一个函数指针类型OP_FUN 该函数指针指向的函数有两个double类型的参数 返回值也是double类型的参数*/
typedef struct OP_STRUCT
{
OP_TYPE opType; /*opType 操作类型*/
OP_FUN opFun; /*opFun 函数指针*/
}OP_STRUCT;
OP_STRUCT j_opStruct[] =
{
{OP_ADD, ADD},
{OP_SUB, SUB},
{OP_MUL, MUL},
{OP_DIV, DIV},
};
int f_opNum = sizeof(j_opStruct) / sizeof(OP_STRUCT);
double fun_caluc(int cmd, double para1, double para2)
{
if (cmd >= f_opNum || cmd < 0)
{
printf("can not find cmd\n");
return 0;
}
return j_opStruct[cmd].opFun(para1, para2);
}
#endif // FUNCTION_JUMP
int main(int argc, char *argv[])
{
double cal_value = 0;
cal_value = fun_caluc(0, 3, 5);
printf("cal_value = %f", cal_value);
return 0;
}
#if 0
cal_value = 8.000000
#endif // 0