我试图在twalk()
search.h
来避免使用全局变量
您可以看到twalk
回调函数但未能包含void *
参数
/* Walk the nodes of a tree */
void
twalk(const void *vroot, void (*action)(const void *, VISIT, int))
{
node *root = (node *)vroot;
if (root != (node *)0 && action != (void (*)(const void *, VISIT, int))0)
trecurse(root, action, 0);
}
void
action(const void *nodep, const VISIT which, const int depth)
{
int *datap;
switch (which) {
case preorder:
break;
case postorder:
datap = *(int **) nodep;
printf("%6d\n", *datap);
break;
case endorder:
break;
case leaf:
datap = *(int **) nodep;
printf("%6d\n", *datap);
break;
}
}
在我自己的文件中使用相同名称重新声明相同结构(tsearch.c中的node_t)的行为是什么?
/* twalk() fake */
struct node_t
{
const void *key;
struct node_t *left;
struct node_t *right;
unsigned int red:1;
};
static void tmycallback(const xdata *data, const void *misc)
{
printf("%s %s\n", (const char *)misc, data->value);
}
static void tmywalk(const struct node_t *root, void (*callback)(const xdata *, const void *), const void *misc)
{
if (root->left == NULL && root->right == NULL) {
callback(*(xdata * const *)root, misc);
} else {
if (root->left != NULL) tmywalk(root->left, callback, misc);
callback(*(xdata * const *)root, misc);
if (root->right != NULL) tmywalk(root->right, callback, misc);
}
}
/* END twalk() fake */
if (root) tmywalk(root, tmycallback, "Hello walker");
答案 0 :(得分:0)
重新声明相同结构的行为是什么(node_t in tsearch.c)在我自己的文件中使用相同的名称?
虽然在C11标准中似乎没有提及它,但是如果您尝试在同一个翻译单元中声明两次结构,则许多编译器会向您发出约束违规诊断(错误消息) 。将struct node_t
声明放入它自己的头文件(可能是tree_node.h)并使用include guards来防止重复声明是个好主意。