定义返回函数指针的函数的各种样式是什么?

Bru*_*uce 1 c pointers

我有一个功能:

int compare(char * c1, char * c2){
...
...
}
Run Code Online (Sandbox Code Playgroud)

我可以编写一个int ret_compare(void * item)返回指向比较的函数的各种样式是什么?

Jon*_*ler 6

有两种主要样式,一种使用a typedef和一种不使用(有两种变体typedef).您的比较器应该采用常量指针,如下所示:

int compare(const char *c1, const char *c2) { ... }

// Raw definition of a function returning a pointer to a function that returns an int
// and takes two constant char pointers as arguments
int (*ret_compare1(void *item))(const char *, const char *)
{
    // Unused argument - item
    return compare;
}

// More usual typedef; a Comparator2 is a pointer to a function that returns an int
// and takes two constant char pointers as arguments
typedef int (*Comparator2)(const char *, const char *);

// And ret_compare2 is a function returning a Comparator2
Comparator2 ret_compare2(void *item)
{
    // Unused argument - item
    return compare;
}

// Less usual typedef; a Comparator3 is a function that returns an int
// and takes two constant char pointers as arguments
typedef int Comparator3(const char *, const char *);

// And ret_compare3 is a function returning a pointer to a Comparator3
Comparator3 *ret_compare3(void *item)
{
    // Unused argument - item
    return compare;
}
Run Code Online (Sandbox Code Playgroud)

请注意,这些比较器不能与bsearch()和一起使用qsort()(除非你使用相当可怕的强制转换),因为这些比较器应该带const void *参数.

另请注意,为了比较字符串而不是单个字符,函数使用qsort()bsearch()应该类似于:

int string_comparator(const void *v1, const void *v2)
{
    const char *s1 = *(char **)v1;
    const char *s2 = *(char **)v2;
    return(strcmp(s1, s2));
}
Run Code Online (Sandbox Code Playgroud)

  • `typedef`的第二个变体经常被忽略.我喜欢它,因为然后头文件可以将比较器函数声明为`Comparator2 compare1; Comparator2 compare2;`这使得它100%清楚该函数意味着用作`Comparator2`.(另外,当传递_to_函数时,`func(Comparator2 cmp)`与`func(Comprator2*cmp)`相同.) (2认同)