- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在做这个类分配,使用经典的 C,并且被这个关于接受可变参数计数和类型的回调函数的问题所困扰。
基本上,我正在研究哈希树(一棵树,其中每个节点都是哈希树),并且我有一个特定的遍历策略,将多次用于不同的目的,所以我将其实现为 ht_walk(HashTree tree, (*callback)(Element e))
,这样作为回调调用的函数将以任何必要的方式处理元素。
问题是,在我的问题的大多数情况下,回调函数必须采用不同的参数。我知道如何使用“可变”函数(使用 stdarg、printf 方式)设计带有可变参数列表的函数,但我不知道如何将这些参数“重新传递”给回调函数。
让我提供一个具体的例子:假设我有一个名为 addToList(Element e, List list)
的回调函数,并且我的 ht_walk 声明现在是 ht_walk(HashTree tree, (*回调)(元素 e),...)
。假设我想在以下代码片段中使用 ht_walk:
HashTree my_tree = ht_create();
/* run some algorithm that populates the tree somehow */
List my_list = list_create();
ht_walk(my_tree, addToList, my_list);
有没有办法做到这一点?提前致谢!
最佳答案
您可以使用以下两种方法之一解决此问题。
最常见、最易理解、最干净的方法是使用“用户”结构:
void ht_walk(HashTree tree, void (*callback)(Element e, void *user), void *user);
void addToList(Element e, void *arg)
{
STATIC_ASSERT(sizeof(void *) >= sizeof(List));
List list = arg;
/* ... */
}
HashTree my_tree = ht_create();
/* run some algorithm that populates the tree somehow */
List my_list = list_create();
ht_walk(my_tree, addToList, my_list);
另一种方法是接受va_list
:
#include <stdarg.h>
void ht_walk(HashTree tree, void (*callback)(Element e, va_list args), ...)
{
for(..)
{
va_list args;
va_start(args, callback);
callback(element, args);
va_end(args);
}
}
void addToList(Element e, va_list args)
{
List list = va_arg(args, List);
/* ... */
}
HashTree my_tree = ht_create();
/* run some algorithm that populates the tree somehow */
List my_list = list_create();
ht_walk(my_tree, addToList, my_list);
关于c - "Repassing"函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/664625/
我正在做这个类分配,使用经典的 C,并且被这个关于接受可变参数计数和类型的回调函数的问题所困扰。 基本上,我正在研究哈希树(一棵树,其中每个节点都是哈希树),并且我有一个特定的遍历策略,将多次用于不同
我有一个在多个站点上使用的程序。它使用 require('config.php');设置任何站点相关变量,如 mysql 连接信息、路径等。 假设我在一个函数中使用了这些依赖于站点的变量之一,例如 $
我是一名优秀的程序员,十分优秀!