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)
如果低层软件需要调用在更高层定义的函数,这是否有益?
这个实现的,因为它知道来填充数组的唯一方法是硬编码的不同: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,而不仅仅是它的产生值的生成器函数.在这种情况下,这可能不是那么糟糕,但是在回调真正发光的情况下(线程,异步通信)重新实现原始而没有回调将是令人望而却步的.
| 归档时间: |
|
| 查看次数: |
4042 次 |
| 最近记录: |