C:如何为具有可变参数计数的函数使用单个函数指针数组?

vau*_*anj 12 c arrays function-pointers

这个问题几乎说明了一切.

我不知道该如何做到这一点,并没有任何有用的东西.

这是一些示例函数:

add(int x, int y) {
  return x+y;
}
Run Code Online (Sandbox Code Playgroud)

和,

mean(int x1, int y1, int x2, int y2) {
  return (x1 + y1 + x2 + y2) / 4;
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已尝试将typedef与两者一起使用,但我无法弄清楚如何使某些东西指向其中一种类型:

typedef int (*mathfunc2)(int x, int y);
typedef int (*mathfunc4)(int x1, int y1, int x2, int y2);

????? func_table[2] = {add, mean};
Run Code Online (Sandbox Code Playgroud)

caf*_*caf 32

您需要选择一个函数指针类型作为"泛型函数指针",使用该类型来定义数组,并使用显式强制转换.将一个函数指针类型转换为另一个函数指针类型然后再返回保证保留该值.

换一种说法:

typedef int (*generic_fp)(void);

generic_fp func_table[2] = { (generic_fp)add, (generic_fp)mean };
Run Code Online (Sandbox Code Playgroud)

然后要调用add,您需要将其强制转换为正确的类型:

result = ((mathfunc2)func_table[0])(x, y);
Run Code Online (Sandbox Code Playgroud)

如果您发现它更可口,您可以定义一些宏:

#define FUNC_2(f, p1, p2) ((mathfunc2)(f))(p1, p2)
#define FUNC_4(f, p1, p2, p3, p4) ((mathfunc4)(f))(p1, p2, p3, p4)

result = FUNC_2(func_table[0], x, y);
Run Code Online (Sandbox Code Playgroud)


npc*_*diu 5

你可以像这样使用外观模式

int add(int x, int y);
int mean(int x1, int y1, int x2, int y2);

typedef int (*operation_fp)(int argc, int* argv);

int add_wrapper(int argc, int* argv) { return add(argv[0], argv[1]); }
int mean_wrapper(int argc, int* argv) { return mean(argv[0], argv[1], argv[2], argv[3]); }

operation_fp func_table[2] = { add_wrapper, mean_wrapper };
Run Code Online (Sandbox Code Playgroud)

虽然代码很丑,但它可以完成工作。您应该在包装器中添加一些验证逻辑。