我在库中有一个函数头,如下所示:
void deepCopy(CList ** clone, CList * cl, void * (* data_clone) (void * d));
我很难正确地传递deep_clone函数。
这就是我目前正在尝试的
CList *ys2 = &ys;
void (*dc) (void *) = &data_clone;
void (**dc2) (void *) = &dc;
deepCopy(&ys2, &xs, dc2);
gcc输出为:
testclist.c:在函数'test_deep_copy'中:
testclist.c:504:警告:从不兼容的指针类型
我在我的dc2声明中尝试了cdecl.org,它说这是我认为是正确的。
非常感谢任何帮助;谢谢。
答案 0 :(得分:3)
该函数不期望“指向函数的指针”,它只是指向函数的指针。
deepCopy(..., &data_clone);
应该足够了。
答案 1 :(得分:0)
dc
和dc2
都返回void
。 deepCopy
预计返回void *
的函数。
如果data_clone
定义为void * data_clone(void * d)
,则只需直接传递&data_clone
。
不要让void * (* data_clone) (void * d));
中的第二个明星混淆你,告诉编译器你正在谈论指向函数的指针只是语法上的糖。它是指向返回void *
并接受void *
的函数的“简单”指针。
答案 2 :(得分:0)
只需传递这样的功能:
deepCopy(..., data_clone);
该函数应该将void *作为参数并返回void *。这就是你在那里看到的第一个虚空的含义。
你不应该需要一个&符号,实际上意味着一个指向指针的指针,因为它已经是一个指针,仅数据就足够了。
示例:
void *test_callback(void *p) {
char *c = p;
*c = 'z';
return c;
}
void test_func(char *a, void* (*callback)(void *p)) {
char *p = callback(a);
printf("%c\n", *p);
}
后来......
char c = 'a';
test_func(&c, test_callback);