我试图找出使用C解决以下问题的最有效方法。
让我们考虑一个通用函数
void foo(int x, int y);
通常,该函数将被调用如下:
int a = 1;
int b = 2;
int c = foo(a, b);
但是,在我的代码中,我必须使用声明为:
的genericCall
函数
int genericCall(void (*func)(void *), void *args, size_t size);
例如,为了执行上面的代码,我必须引入辅助函数和结构:
// Define a struct to store the arguments
struct foo_args {
int x;
int y;
}
// Auxiliary function
void foo_aux(void *args) {
struct foo_args *args;
int x, y;
// Unpack the arguments
args = (struct foo_args *) args;
x = args->x;
y = args->y;
// Invocation of the original function
foo(x, y);
}
// ...
// Pack the arguments in the struct
struct foo_args args;
args.x = 1;
args.y = 2;
// Call the generic function
genericCall(foo_aux, &args, sizeof(struct foo_args));
你可以想象这种方法不能很好地扩展:每次我想调用一个不同的函数时,我必须添加许多代码,除了处理参数之外几乎没有。
有没有办法在不复制所有代码的情况下做同样的事情?
谢谢!
答案 0 :(得分:1)
不,你可以做的更多。您的通用接口不允许传递类型信息,如果您有一个要传递多个参数的函数,则必须将它们放在可通过单个指针访问的位置。
这就是如何使用线程接口(POSIX或C11)进行编码。