传递函数指针的参数

时间:2012-04-22 17:08:35

标签: c hashtable function-pointers

我应该用hashtable(链接数据列表指针数组)和一些支持函数编写C ++ STL容器映射(关联数组)的C实现,即插入元素,删除表...我已经成功写了所有这些,除了一个,foreach(table, function_ptr)函数,它调用表中所有数据的传递函数(打印内容......)。

我有点卡在这里因为我无法弄清楚应该将哪些参数传递给function_ptr,所以它会是通用的。至于现在,我认为这是不可能的。

如果我只想将指针传递给printf,那就很简单了,foreach的原型看起来像这样

foreach(table_t *t, int (*function_ptr)(const char *fmt, ...))

我会为每个像这样的数据节点调用它

function_ptr("%s, %d\n", node.key, node.data)

但是如果我使用它并且有一天改变我的想法我想传递自己的函数,我将不得不更改调用函数和foreach函数的代码。

有没有简单的方法可以做这样的事情?

1 个答案:

答案 0 :(得分:5)

指定“任何参数类型”的传统方法是使用void *这样:

foreach(table_t *t, int (*function_ptr)(void *p))

然后你可以传递每个参数的地址(可能是一个复杂的数据类型,如结构),然后函数可以将它转换回适当的类型:

struct {
  int x;
  int y;
} numbers;

// Sums the numbers in a structure
int sum(void *p) {
  numbers *n = (numbers *) p;  // Cast back to the correct type
  return n->x + n->y;
}

// Counts the number of 'a' chars in a string
int numberOfA(void *p) {
  char *s = (char *) p;
  int num = 0;
  while (s != NULL && *s != '\0') {
    if (*s == 'a') {
      ++num;
    }
  }
}