Обратите внимание, что стандартное определение qsort()
включает const
:
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
Обратите внимание, что для компаратора строк задаются два значения 'char **
', а не значения char *
.
Я пишу свои компараторы, чтобы в вызывающем коде не требовалось приведение:
#include <stdlib.h> /* qsort() */
#include <string.h> /* strcmp() */
int num_cmp(const void *v1, const void *v2)
{
int i1 = *(const int *)v1;
int i2 = *(const int *)v2;
if (i1 < i2)
return -1;
else if (i1 > i2)
return +1;
else
return 0;
}
int str_cmp(const void *v1, const void *v2)
{
const char *s1 = *(const char **)v1;
const char *s2 = *(const char **)v2;
return(strcmp(s1, s2));
}
Заставлять людей писать код в кодах, используя ваши функции, ужасно. Не.
Две написанные мной функции соответствуют прототипу функции, требуемому стандартом qsort()
. Имя функции, за которым не следуют круглые скобки, эквивалентно указателю на функцию.
В более старом коде или коде, написанном теми, кто воспитывался на старых компиляторах, вы обнаружите, что указатели на функции используются с использованием нотации:
result = (*pointer_to_function)(arg1, arg2, ...);
В современном стиле написано:
result = pointer_to_function(arg1, arg2, ...);
Лично я нахожу явное разыменование более понятным, но не все с этим согласны.