2011-10-21 15 views
1

を返す関数を定義する様々なスタイルが、私は1つの機能を持っているどのようなものです:関数ポインタ

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

私は比較するためのポインタを返す関数int ret_compare(void * item)を書き込むことができる様々なスタイルは何ですか?

答えて

6

メインスタイルには、typedefを使用するスタイルと、使用しないスタイル(typedefの2種類があります)があります。これらのコンパレータは、const void *引数を取ることが期待されているため、これらのコンパレータはbsearch()qsort()(あなたはかなり陰惨なキャストを使用しない限り)と一緒に使用することができないこと

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; 
} 

注:お使いのコンパレータは、以下のように、一定のポインタを取る必要があります。

int string_comparator(const void *v1, const void *v2) 
{ 
    const char *s1 = *(char **)v1; 
    const char *s2 = *(char **)v2; 
    return(strcmp(s1, s2)); 
} 
+0

コンペア機能の引数がvoidべきではありません*:

注は、あまりにも、それは単一の文字とは反対に、qsort()またはbsearch()で使用される機能を、文字列を比較するために類似すべきですか? – Bruce

+0

@ Bruceこれは例として使ったのと同じ比較関数です。 – pmr

+2

'typedef'の2番目のバリエーションはしばしば見落とされます。私はそれが好きです。なぜなら、ヘッダファイルはコンパレータ関数を 'Comparator2 compare1; Comparator2 compare2; 'は、その関数が' Comparator2'として使用されることを100%明確にします。 (また、関数に渡されるとき、 'func(Comparator2 cmp)'は 'func(Comprator2 * cmp)'と同じです。) –