我开发了一个函数回调机制。这是我的功能。
int function_root(var1,var2, int(*callback)(), ...);
如果 var1 = var2 ,那么回调(va_arg list);
例如:
function_root(A,B,的 fun_clbck 下,X,Y,Z); //如果a = b
我们会得到这个: fun_clbk(x,y,z);
问题是。当我的函数回调至少有一个参数时。我收到警告与原型不兼容
我认为问题出在我的函数root中。我用零参数声明了int(* callback)(),并且我做了一个像fun_clbck(int,int,int)这样的回调;它触发了这个问题。
答案 0 :(得分:2)
我声明
int(*callback)()
零参数
那不是真的。 int(*callback)()
不是C89 / C99原型;它声明一个返回int
的函数的函数指针,而不指定参数类型。没有参数的函数指针的正确声明将是
int (*callback)(void)
一旦我执行了
fun_clbck(int,int,int);
之类的回调,就会触发该问题
显然。为回调函数声明的参数类型必须与调用中的参数类型匹配。重新考虑你的设计,例如使用可变数量的参数:
int (*callback)(unsigned, ...)
并将实际参数的数量作为第一个参数传递。
答案 1 :(得分:0)
使用变量参数列表(stdarg.h)传递参数。见http://www.cplusplus.com/reference/clibrary/cstdarg/
类似这样的事情
编辑:
template <typename T>
int mycallback(unsigned amount, ...){
int i;
T val;
va_list vl;
va_start(vl,amount);
for (i=0;i<amount;i++){
val+=va_arg(vl,T);
}
va_end(vl);
};
template <typename T>
int function_root(int var1, int var2, int(*callback)(unsigned, ...)<T>, unsigned amount, ...){
if (var1 == var2)
return callback<T>(amount, ...);
};
答案 2 :(得分:0)
函数指针
int (*callback)()
是一个指向函数的指针,该函数具有未指定数量的未指定类型的参数,返回int
。
它可以保存指向任何返回int
且具有固定数量参数的函数的指针。
例如
int foo(int a, int b, int c)
{
return 0;
}
int (*callback)() = foo;
没问题。
但是必须修复函数的参数数量。它不能是变量的(你不能用带有省略号(...)表示法的原型传递函数。)