首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仍然没有得到回调与正常函数调用

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

Stack Overflow用户
提问于 2013-07-19 15:06:37
回答 1查看 430关注 0票数 2

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

代码语言:javascript
复制
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,以便在其中提供回调。那么,为什么要用指针函数的方式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-19 15:12:35

代码语言:javascript
复制
void populate_array(int *array, size_t arraySize,
        int getNextValue(void))  // Note that, here I use normal function call.

这不是函数调用:不能在声明中调用函数。getNextValue是一个指向函数的指针,它不接受参数,并返回使用不同语法声明的int

考虑这个类推:您可以为指向int的指针定义一个新类型,并在函数的声明中使用它

代码语言:javascript
复制
typedef int* intptr_t;
void myFunction(intptr_t ptr) {
    ...
}

或者您可以说ptr是声明中指向int的指针:

代码语言:javascript
复制
void myFunction(int* ptr) {
    ...
}

同样,在声明中使用函数指针之前,可以定义函数指针的类型。

代码语言:javascript
复制
typedef void generator_t(void);
void populate_array(int *array, size_t arraySize, generator_t getNextValue) {
}

或者您可以说getNextValue是一个函数指针,它使用了来自post的替代语法。

为函数指针使用typedef的一个原因是,当您想要创建函数指针数组时,一致性检查:如果您的库函数使用在该函数声明中定义的函数指针,则需要在您自己的代码中重新创建相同的声明,以创建一个作为指针传递给库的指针数组。这可能导致只在调用库函数时才能看到的不一致,而不是数组声明点,从而使潜在问题更难跟踪。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17749452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档