为什么使用回调而不是正常的函数调用?

Opt*_*der 3 c function-pointers callback

我试图理解回调,并且确实得到了这个想法,但是不明白为什么它真的需要.

具体来说,它通过正常的函数调用提供了哪些额外的好处?我在看这里接受的答案:C中的"回调"是什么?它们是如何实现的?

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

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);
   ...
}
Run Code Online (Sandbox Code Playgroud)

如果低层软件需要调用在更高层定义的函数,这是否有益?

das*_*ght 7

这个实现的,因为它知道来填充数组的唯一方法是硬编码的不同: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);
Run Code Online (Sandbox Code Playgroud)

根据您的实现,我将不得不populate_array为每个案例单独编写.如果填充我需要的数组的方式不是库的一部分,我就可以实现整体populate_array,而不仅仅是它的产生值的生成器函数.在这种情况下,这可能不是那么糟糕,但是在回调真正发光的情况下(线程,异步通信)重新实现原始而没有回调将是令人望而却步的.