C 定义返回函数指针的函数有哪些不同风格
我有一个功能:C 定义返回函数指针的函数有哪些不同风格,c,pointers,C,Pointers,我有一个功能: int compare(char * c1, char * c2){ ... ... } 我可以编写返回指针进行比较的函数int ret_comparevoid*项的各种样式是什么?有两种主要样式,一种使用typedef,另一种不使用两种typedef变体。比较器应采用常量指针,如下所示: int compare(const char *c1, const char *c2) { ... } // Raw definition of a function returning
int compare(char * c1, char * c2){
...
...
}
我可以编写返回指针进行比较的函数int ret_comparevoid*项的各种样式是什么?有两种主要样式,一种使用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));
}
有两种主要样式,一种使用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));
}
比较函数的参数不应该是void*?@Bruce这与您作为示例使用的比较函数相同。typedef的第二个变体经常被忽略。我喜欢它,因为这样头文件可以将comparator函数声明为Comparator2 compare1;比较器2比较器2;这就100%清楚地表明,该函数将用作比较器2。另外,当传递给函数时,funcComparator2 cmp与funcComparator2*cmp相同。@Bruce-这取决于API。qsort API需要int*const void*,const void*。示例代码的API是int*char*,char*。这个答案中更理智的API使用const char*来防止意外修改比较器中的值。@布鲁斯:这取决于上下文。如果您计划将比较器与标准的bsearch或qsort函数一起使用,那么是的,参数应该是const void*,并且通常,字符串比较的基础值是char**而不是char*。但是,由于原始函数是int comparechar*c1,char*c2{…},因此我保留了原始函数的类型并添加了const类型限定符。这将在自定义代码中使用,而不是与qsort一起使用。比较函数的参数是否应为void*?@Bruce这与您作为示例使用的比较函数相同。typedef的第二个变体经常被忽略。我喜欢它,因为这样头文件可以将comparator函数声明为Comparator2 compare1;比较器2比较器2;这就100%清楚地表明,该函数将用作比较器2。另外,当传递给函数时,funcComparator2 cmp与funcComparator2*cmp相同。@Bruce-这取决于API。qsort API需要int*const void*,const void*。示例代码的API是int*char*,char*。这个答案中更理智的API使用const char*来防止意外修改比较器中的值。@布鲁斯:这取决于上下文。如果您计划将比较器与标准的bsearch或qsort函数一起使用,那么是的,参数应该是const void*,并且通常,字符串比较的基础值是char**而不是char*。但是,由于原始函数是int comparechar*c1,char*c2{…},因此我保留了原始函数的类型并添加了const类型限定符。这将在自定义代码中使用,而不是在qsort中使用。