【问题标题】:Still not getting callback vs normal function call仍然没有得到回调与正常的函数调用
【发布时间】:2013-07-19 15:06:37
【问题描述】:

我在这里看到了几乎所有流行的回调问题,但仍然不明白为什么在回调中使用函数指针而不是简单地通过普通函数使用回调。这是一个热门问题的公认答案(已修改)

void populate_array(int *array, size_t arraySize,
            int getNextValue(void))  // Note that, here I use normal function call.
{
    for (size_t i=0; i<arraySize; i++)
        array[i] = getNextValue();
}

int getNextRandomValue(void)
{
    return rand();
}

int main(void)
{
    int myarray[10];
    populate_array(myarray, 10, getNextRandomValue);
    ...
}

正如你在上面看到的,我仍然可以通过简单的函数来实现回调,那么为什么要使用函数指针来实现回调呢? (即为什么要传递参考),什么时候我可以不这样做。

此外,我们可以在没有函数指针的情况下实现qsort, bsearch 以在其中提供回调。那么,为什么要用函数指针的方式呢。

【问题讨论】:

  • 它们的工作方式相同——它们是指向函数的指针。类似于(在您的 main 的上下文中)myarray&amp;myarray 都指向同一事物。
  • @DrewMcGowen 差不多了。 myarray&amp;myarray 不要指向同一个东西。
  • 那么,为什么人们更喜欢int(*foo)(void) 而不是int foo()
  • @ashish2expert 因为它 1. 更明确,2. 更接近真相。
  • "请注意,这里我使用的是普通函数调用。"不,这不是正常的函数调用!它是一个函数指针,只是使用了不同的语法。

标签: c pointers callback function-pointers


【解决方案1】:
void populate_array(int *array, size_t arraySize,
        int getNextValue(void))  // Note that, here I use normal function call.

这不是函数调用:你不能在声明中调用函数。 getNextValue 是一个指向函数的指针,它不带参数并返回使用不同语法声明的 int

考虑这个类比:您可以为指向int 的指针定义一个新类型并在函数声明中使用它

typedef int* intptr_t;
void myFunction(intptr_t ptr) {
    ...
}

或者你可以说ptr是一个指向int的指针:

void myFunction(int* ptr) {
    ...
}

同样,你可以在声明中使用函数指针之前定义它的类型

typedef void generator_t(void);
void populate_array(int *array, size_t arraySize, generator_t getNextValue) {
}

或者您可以说getNextValue 是使用您帖子中的替代语法的函数指针。

为函数指针使用typedef 的一个原因是当您想要创建函数指针数组时进行一致性检查:如果您的库函数使用在该函数声明中定义的函数指针,则需要重新创建相同的在您自己的代码中声明以创建您打算作为指针传递给库的指针数组。这可能会导致不一致,这些不一致仅在调用库函数时可见,而不是在数组声明时可见,从而使潜在问题更难追踪。

【讨论】:

  • 那么,如果我们可以像上面那样做,为什么要这么辛苦
  • @ashish2expert 我应该重复一遍吗? “因为它 1. 更明确,2. 更接近真相。”
  • @ashish2expert 在函数声明之外定义指针类型可以更容易地传递用于在目标库中使用的指针。
  • 在声明中不能有函数调用并不完全正确:#include &lt;stdio.h&gt;void foo(int a[][printf("Hello, world.\n")]) {}int main(void) { foo(0); return 0; } 打印“Hello, world.”。
  • @EricPostpischil 现在是邪恶的;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
相关资源
最近更新 更多