【问题标题】:C - Pass a function a pointer to a pointer to a functionC - 向函数传递一个指向函数指针的指针
【发布时间】:2012-02-21 00:19:21
【问题描述】:

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

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,它说这是我认为是正确的。

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

【问题讨论】:

  • 如果您已经知道 cdecl,请在 data_clone 上使用它 :)
  • 它说有语法错误。它似乎不喜欢函数头。
  • 您需要省略参数名称,例如explain void * (* data_clone) (void *)。你也应该在你的代码中这样做。

标签: c function pointers function-pointers


【解决方案1】:

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

deepCopy(..., &data_clone);

应该够了。

【讨论】:

  • 谢谢。这使它运行,但它仍然坚持警告我。我能阻止它吗?
  • 它是:testclist.c:在函数'test_deep_copy'中:testclist.c:505:警告:从不兼容的指针类型传递'deepCopy'的参数3
  • @ratbum:data_clone 是如何声明的?
  • 没有原型:void data_clone(void *d) {...}
  • @ratbum:好吧,那不一样。该函数需要返回void *,而不是void
【解决方案2】:

dcdc2 都返回 voiddeepCopy 期望函数返回 void *

如果data_clone 定义为void * data_clone(void * d),那么直接传递&data_clone

不要让void * (* data_clone) (void * d)); 中的第二个星号混淆您,它只是告诉编译器您正在谈论一个指向函数 的指针的语法糖。它是一个“简单”指针,指向返回 void * 并接受 void * 的函数。

【讨论】:

    【解决方案3】:

    只需像这样传递函数:

    deepCopy(..., data_clone);
    

    函数应该接受一个 void* 作为参数并返回一个 void*。这就是您在那里看到的第一个 void* 的含义。

    你不应该需要一个&符号,这实际上意味着一个指向指针的指针,因为它已经是一个指针,单独 data_clone 就足够了。

    例子:

    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);
    

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多