gpt4 book ai didi

c - "Repassing"函数参数

转载 作者:太空宇宙 更新时间:2023-11-04 01:15:52 24 4
gpt4 key购买 nike

我正在做这个类分配,使用经典的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com