Параметры компаратора qsort
являются указателями на постоянные версии сравниваемых элементов.В вашем примере сравниваемые элементы const char *
, поэтому указатель на const равен const char * const *
.Следовательно, правильная версия кода:
int scmp(const void *s1, const void *s2)
{
auto pc1 = static_cast<const char * const *>(s1);
auto pc2 = static_cast<const char * const *>(s2);
char const *c1 = *pc1;
char const *c2 = *pc2;
return strcmp(c1, c2); // or whatever
}
Вы можете покончить с pc1
, pc2
и применить оператор *
к результату приведения, если хотите.
Возможно, вы ошибочно предположили, что аргументы - это сравниваемые элементы, тогда как на самом деле они являются указателями на сравниваемые элементы.
Если все еще неясно, возможно, будет полезно использовать символическое имя для элементатип:
using ELEMENT_T = const char *;
int scmp(void const *s1, void const *s2)
{
auto pc1 = static_cast<ELEMENT_T const *>(s1);
auto pc2 = static_cast<ELEMENT_T const *>(s2);
ELEMENT_T c1 = *pc1;
ELEMENT_T c2 = *pc2;
return strcmp(c1, c2); // or whatever
}
Тот же шаблон будет работать для элементов, которые не являются указателями (например, целочисленные элементы).