我在这里看到几乎所有流行的回调问题,但仍然没有得到为什么在回调中使用函数指针而不是简单地通过普通函数使用回调。以下是流行问题的(已修改)的接受答案
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
以在其中提供回调。那么,为什么用指向函数的方式。
答案 0 :(得分:2)
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
作为函数指针的一个原因是当你想要创建函数指针数组时进行一致性检查:如果你的库函数使用在函数声明中定义的函数指针,你需要重新创建您自己的代码中的相同声明,以创建您打算作为指针传递给库的指针数组。这可能导致不一致,只有在调用库函数时才能看到,而不是数组声明,这使得潜在的问题更难以追踪。