我在这里看到了几乎所有流行的回调问题,但仍然不明白为什么在回调中使用函数指针而不是简单地通过普通函数使用回调。以下是一个流行问题的公认答案(修改)
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,以便在其中提供回调。那么,为什么要用指针函数的方式。
发布于 2013-07-19 15:12:35
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是一个函数指针,它使用了来自post的替代语法。
为函数指针使用typedef的一个原因是,当您想要创建函数指针数组时,一致性检查:如果您的库函数使用在该函数声明中定义的函数指针,则需要在您自己的代码中重新创建相同的声明,以创建一个作为指针传递给库的指针数组。这可能导致只在调用库函数时才能看到的不一致,而不是数组声明点,从而使潜在问题更难跟踪。
https://stackoverflow.com/questions/17749452
复制相似问题