我正在尝试为给定的输入构建解析器,有8种可能的命令。因此,我认为这不是使用case switch
块的丑陋技术:
switch(command)
case cmd1:
.... /*call a function that do cmd1*/
case cmd2
..../*call a function that do cmd2*/
我将在头文件中定义一个结构数组,每个结构都包含函数的名称和一个指向函数的指针:
typedef struct command_info
{
char *name;
void (*func)(int)
};
command_info command_table[] = {{"func1", &func1}, {"func2", &func2} }
以便我可以切换到更优雅的位置:
int i;
for(i = 0; i < COMMAND_TABLE_LENGTH; i++)
if(!strcmp(command_table[i].name, command))
command_table[i].func(2);
我唯一的问题是,这些函数具有不同的参数(全部返回void)。这对我来说不是问题,因为我可以检查函数是func1
还是func2
搜索一个int参数,例如是func3
还是func4
搜索两个int(比[ C0])。但是函数指针仅指向具有某种类型和数量的参数的函数。如何制作可以指向任何函数的通用指针?
如何制作可以指向任何函数的通用指针?
任何函数指针都可以通过类型转换为另一个函数指针来转换。
case switch
功能指针不需要证明功能签名。
int (*foo)(int) = (int (*)(int)) sqrt;
double (*sq)(double) = (double (*)(double)) foo;
printf("%f\n", sq(2));
OP具有“函数具有不同的参数(所有返回空值)”,因此在OP中,代码可以使用:
// No parameter info
// vv
int (*foo)() = (int (*)()) sqrt;
typedef struct command_info {
char *name; // suggest const char *name
void (*func)(); // no parameter info nor checking
}
是通用的object指针。我可能不足以对function指针进行编码。