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

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

我不确定如何做到这一点,并没有任何有效的东西。

这是一些示例函数:

add(int x, int y) { return x+y; } 

和,

 mean(int x1, int y1, int x2, int y2) { return (x1 + y1 + x2 + y2) / 4; } 

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

 typedef int (*mathfunc2)(int x, int y); typedef int (*mathfunc4)(int x1, int y1, int x2, int y2); ????? func_table[2] = {add, mean}; 

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

换一种说法:

 typedef int (*generic_fp)(void); generic_fp func_table[2] = { (generic_fp)add, (generic_fp)mean }; 

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

 result = ((mathfunc2)func_table[0])(x, y); 

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

 #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); 

您可以像这样使用Facade模式 :

 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 }; 

虽然代码很难看,但它确实起到了作用。 您应该在包装器中添加一些validation逻辑。

 int (*func[])() = { add, mean }; 

这两种函数类型不兼容。 严格地说,它们可以使用完全不同的参数传递来实现。 例如,实现可以选择具有最多3个参数的所有函数通过寄存器接收它们,并且所有其他函数通过堆栈接收它们。

你可以做的是用varargs参数定义这两个函数,使它们遵循相同的参数传递方案。

你打算怎么打算调用这些函数,不知道他们期望有多少参数?