C.函数指针回调。与原型不兼容。

时间:2012-01-17 14:14:57

标签: c

我开发了一个函数回调机制。这是我的功能。

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)这样的回调;它触发了这个问题。

3 个答案:

答案 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;

没问题。

但是必须修复函数的参数数量。它不能是变量的(你不能用带有省略号(...)表示法的原型传递函数。)