如何将函数和变量参数列表传递给C中的另一个函数?

时间:2016-07-07 18:38:41

标签: c function pointers syntax

我想将任意函数及其参数传递给C中的另一个函数。

例如,如下面的代码(显然不起作用)

#include <stdio.h>

void doit(int (*f)(...), char *fname, ...)
{
    va_list argptr;
    va_start(argptr, fname);
    f(argptr)
    va_end(argptr);
}   

int func1(char *a, int b)
{
    fprintf(stderr, "func1 %s %d\n", a, b);
}   

int func2(char *a, int b, int c)
{
    fprintf(stderr, "func2 %s %d %d\n", a, b, c);
}

int main(int argc, char **argv)
{

    doit(func1, "func1", "blah", 10);

    return 0;
}   

2 个答案:

答案 0 :(得分:5)

如果您希望让他们参与此类计划,您需要va_list转发器。类似的东西:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

void doit(int (*f)(va_list va), char *fname, ...)
{
    va_list argptr;
    va_start(argptr, fname);
    f(argptr);
    va_end(argptr);
}

int func1(const char *a, int b)
{
    fprintf(stderr, "func1 %s %d\n", a, b);
    return 0;
}

int func1_va(va_list va)
{
    const char * a = va_arg(va, const char*);
    int b = va_arg(va, int);
    return func1(a,b);
}

int func2(const char *a, int b, int c)
{
    fprintf(stderr, "func2 %s %d %d\n", a, b, c);
    return 0;
}

int func2_va(va_list va)
{
    const char *a = va_arg(va, const char*);
    int b = va_arg(va, int);
    int c = va_arg(va, int);
    return func2(a,b,c);
}

int main(int argc, char **argv)
{

    doit(func1_va, "func1", "blah", 10);
    doit(func2_va, "func2", "blahblah", 100, 200);

    return 0;
}

<强>输出

func1 blah 10
func2 blahblah 100 200

答案 1 :(得分:0)

首先:如果您不知道如何传递参数或激活记录如何工作,请不要使用 va_args

你最好的办法是用过多的args声明doit():

void doit(void(* p_func)(),int arg1,int arg2,int arg3,int arg4,int arg5);

并使用所有这些参数调用(* p_func)()。如果被调用的函数达不到它需要的数量,那么就不会有任何麻烦。即使它确实如此,它也只会将垃圾值从堆栈中拉出来。