gpt4 book ai didi

c - 仍然没有得到回调与正常函数调用

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:10 25 4
gpt4 key购买 nike

我在这里看到了几乎所有流行的回调问题,但仍然不明白为什么在回调中使用函数指针而不是通过普通函数简单地使用回调。这是一个热门问题的公认答案(已修改)

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,以在其中提供回调。那么,为什么要用函数指针的方式。

最佳答案

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 的一个原因是当你想创建函数指针数组时进行一致性检查:如果你的库函数使用函数声明中定义的函数指针,你需要在您自己的代码中重新创建相同的声明,以创建您打算作为指针传递给库的指针数组。这可能会导致不一致,这种不一致仅在调用库函数时可见,而不是在数组声明时可见,从而使潜在问题更难追踪。

关于c - 仍然没有得到回调与正常函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17749452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com