У меня есть одна функция:
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)); }