c - 为什么使用回调而不是普通的函数调用?

标签 c callback function-pointers

我正在尝试理解回调,并确实理解了这个想法,但不明白为什么真正需要它。

具体而言,与普通函数调用相比,它提供了哪些额外好处?我在这里查看已接受的答案:What is a "callback" in C and how are they implemented?

我在下面重做了同样的事情,只是没有使用函数指针。这和这个有什么不同?

void populate_array(int *array, size_t arraySize)
{
   for (size_t i=0; i<arraySize; i++)
      array[i] = getNextRandomValue();
}

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

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

只有下层软件需要调用在上层定义的函数时才有用吗?

最佳答案

此实现的不同之处在于它知道填充数组的唯一方法是硬编码的:getNextRandomValue填充数组的方式,并且 它是提供 populate_array 功能的库的一部分。从本质上讲,这两个功能被烘焙成一个整体(说同一件事的奇特方式是说它们“紧密耦合”)。

使用原始实现,我可以在不更改 populate_array 中的一行的情况下执行以下所有操作:

int getNextRandomValue(void) {
    return rand();
}
int getNextEvenValue(void) {
    static int even = 2;
    return (even += 2);
}
int getNextNegativeValue(void) {
    static int neg = -1;
    return neg--;
}
int getNextValueFromUser(void) {
    int val;
    scanf("%d", &val);
    return val;
}

populate_array(myarray, 10, getNextRandomValue);
populate_array(myarray, 10, getNextEvenValue);
populate_array(myarray, 10, getNextNegativeValue);
populate_array(myarray, 10, getNextValueFromUser);

对于您的实现,我将不得不为这些情况中的每一个编写一个单独的 populate_array。如果我需要的填充数组的方法不是库的一部分,那么我就要实现整个 populate_array,而不仅仅是它的值生成器函数。在这种情况下,这可能并没有那么糟糕,但在回调真正发挥作用的情况下(线程、异步通信),重新实现没有回调的原始内容将是令人望而却步的。

关于c - 为什么使用回调而不是普通的函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16506351/

相关文章:

不使用 sprintf() 将 float 转换为字符串

c - 如何编写程序将输入文件中的字符与命令行中指定的字符交换?

swift - 如何将实例方法用作仅采用 func 或文字闭包的函数的回调

android - Activity和Fragment之间如何回调?

c++ - 使用省略号转换指向函数的指针

c - C 中的函数指针实际上是如何工作的?

指向全局函数的 C++ 类成员指针

c - Linux 中的文件锁定

javascript - 涉及异步调用时,如何设置具体的执行顺序?

c - 如何删除 C 中的所有赔率位?