1
我有一個功能:什麼是各種風格的定義函數返回一個函數指針
int compare(char * c1, char * c2){
...
...
}
什麼是我可以寫一個函數int ret_compare(void * item)
返回一個指針來比較各種風格?
我有一個功能:什麼是各種風格的定義函數返回一個函數指針
int compare(char * c1, char * c2){
...
...
}
什麼是我可以寫一個函數int ret_compare(void * item)
返回一個指針來比較各種風格?
有兩種主要樣式,一種使用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));
}
不應該的比較功能的參數是無效的*? – Bruce
@Bruce這是您用作示例的相同比較函數。 – pmr
'typedef'的第二個變體經常被忽略。我喜歡它,因爲然後頭文件可以將比較函數聲明爲'Comparator2 compare1; Comparator2 compare2;'這使得100%清楚該函數是用作'Comparator2'。 (另外,當函數傳遞給函數時,'func(Comparator2 cmp)'和'func(Comprator2 * cmp)'相同。) –