1
を返す関数を定義する様々なスタイルが、私は1つの機能を持っているどのようなものです:関数ポインタ
int compare(char * c1, char * c2){
...
...
}
私は比較するためのポインタを返す関数int ret_compare(void * item)
を書き込むことができる様々なスタイルは何ですか?
を返す関数を定義する様々なスタイルが、私は1つの機能を持っているどのようなものです:関数ポインタ
int compare(char * c1, char * c2){
...
...
}
私は比較するためのポインタを返す関数int ret_compare(void * item)
を書き込むことができる様々なスタイルは何ですか?
メインスタイルには、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));
}
コンペア機能の引数がvoidべきではありません*:
注は、あまりにも、それは単一の文字とは反対に、
qsort()
またはbsearch()
で使用される機能を、文字列を比較するために類似すべきですか? – Bruce@ Bruceこれは例として使ったのと同じ比較関数です。 – pmr
'typedef'の2番目のバリエーションはしばしば見落とされます。私はそれが好きです。なぜなら、ヘッダファイルはコンパレータ関数を 'Comparator2 compare1; Comparator2 compare2; 'は、その関数が' Comparator2'として使用されることを100%明確にします。 (また、関数に渡されるとき、 'func(Comparator2 cmp)'は 'func(Comprator2 * cmp)'と同じです。) –