C - 将函数指向指向函数的指针

时间:2012-02-21 00:19:21

标签: c function pointers function-pointers

我在库中有一个函数头,如下所示:

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:警告:从不兼容的指针类型

传递'deepCopy'的参数3

我在我的dc2声明中尝试了cdecl.org,它说这是我认为是正确的。

非常感谢任何帮助;谢谢。

3 个答案:

答案 0 :(得分:3)

该函数不期望“指向函数的指针”,它只是指向函数的指针。

deepCopy(..., &data_clone);

应该足够了。

答案 1 :(得分:0)

dcdc2都返回voiddeepCopy预计返回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);