我想将任意函数及其参数传递给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;
}
答案 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)()。如果被调用的函数达不到它需要的数量,那么就不会有任何麻烦。即使它确实如此,它也只会将垃圾值从堆栈中拉出来。