如何在调用泛型函数时有效地处理参数

时间:2015-10-08 18:49:24

标签: c function dry

我试图找出使用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));

你可以想象这种方法不能很好地扩展:每次我想调用一个不同的函数时,我必须添加许多代码,除了处理参数之外几乎没有。

有没有办法在不复制所有代码的情况下做同样的事情?

谢谢!

1 个答案:

答案 0 :(得分:1)

不,你可以做的更多。您的通用接口不允许传递类型信息,如果您有一个要传递多个参数的函数,则必须将它们放在可通过单个指针访问的位置。

这就是如何使用线程接口(POSIX或C11)进行编码。