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参数定义这两个函数,使它们遵循相同的参数传递方案。
你打算怎么打算调用这些函数,不知道他们期望有多少参数?