我有一个功能:
int compare(char * c1, char * c2){
...
...
}
我可以编写函数int ret_compare(void * item)
以返回指向比较的指针的各种样式是什么?
答案 0 :(得分:6)
有两种主要样式,一种使用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;
}
请注意,这些比较器不能与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));
}