我正在尝试理解回调,并确实理解了这个想法,但不明白为什么真正需要它。
具体而言,与普通函数调用相比,它提供了哪些额外好处?我在这里查看已接受的答案: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/