2011-10-21 34 views

回答

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)); 
} 
+0

不應該的比較功能的參數是無效的*? – Bruce

+0

@Bruce這是您用作示例的相同比較函數。 – pmr

+2

'typedef'的第二個變體經常被忽略。我喜歡它,因爲然後頭文件可以將比較函數聲明爲'Comparator2 compare1; Comparator2 compare2;'這使得100%清楚該函數是用作'Comparator2'。 (另外,當函數傳遞給函數時,'func(Comparator2 cmp)'和'func(Comprator2 * cmp)'相同。) –