使用相同的指针指向具有不同参数的函数

问题描述 投票:0回答:1

我正在尝试为给定的输入构建解析器,有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])。但是函数指针仅指向具有某种类型和数量的参数的函数。如何制作可以指向任何函数的通用指针?

c pointers arguments function-pointers ansi-c
1个回答
0
投票

如何制作可以指向任何函数的通用指针?

任何函数指针都可以通过类型转换为另一个函数指针来转换。

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指针进行编码。

© www.soinside.com 2019 - 2024. All rights reserved.