回调和函数指针之间是什么关系?

时间:2019-04-24 20:47:49

标签: c++ c function syntax

我对此主题有些困惑。我知道什么是回调,但是函数指针让我更加困惑。它们是否可以表示同一件事(至少在C / C ++上下文中)?还是其中之一包括其他功能,例如函数指针可以用作回调,反之亦然。

函数指针和回调之间是否存在关系,或者它们是完全不同的主题?

1 个答案:

答案 0 :(得分:6)

函数指针通常用于实现回调。一个典型的例子是qsort函数:

void qsort(void *base, size_t nmemb, size_t size,
           int (*compar)(const void *, const void *));

此函数的第四个参数是函数指针。通常,这将指向您自己编写的qsort函数将调用的函数。这是一个用法示例:

int cmp(const void *v1, const void *v2)
{
    const int *i1 = v1;    // C++ requires cast, C doesn't
    const int *i2 = v2;    // C++ requires cast, C doesn't
    if (*i1 < *i2) {
        return -1;
    } else if (*i1 > *i2) {
        return 1;
    } else {
        return 0;
    }
}

int main()
{
    int array[] = { 3, 7, 5, 1, 2, 9, 0, 4 };
    qsort(array, 8, sizeof(int), cmp);
}

在此示例中,cmp用于告诉qsort函数如何对列表中的元素进行排序。

不是回调的函数指针的另一个示例是,如果您想基于某个标志调用特定类型的函数。例如:

void foo(int case_sensitive)
{
    int (*cmpfunc)(const char *, const char *);
    if (case_sensitive) { 
        cmpfunc = strcmp;
    } else {
        cmpfunc = strcasecmp;
    }

    ...
    // set strings str1 and str2
    ...
    if (cmpfunc(str1, str2) == 0)) {
        printf("strings are equal\n");
    } else {
        printf("strings are not equal\n");
    }
    ...
    // set strings str3 and str4
    ...
    if (cmpfunc(str3, str4) == 0)) {
        printf("strings are equal\n");
    } else {
        printf("strings are not equal\n");
    }
    ...
}