- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
//
// 'compare_keywords()' - Compare two keywords...
//
extern "C" {
int
compare_keywords(const void *a,
const void *b) {
return (strcmp(*((const char **)a), *((const char **)b)));
}
}
P.S. Но каст ужасен.
Хотя, вроде можно и strcmp напрямую засунуть
http://www.cplusplus.com/reference/cstdlib/bsearch/
З.Ы. Претензии к касту сняты.
Честно говоря, reinterpet_cast выглядел бы няшнее тут (ведь C++ же!):
а static не прокатит?
Заодно компилятор мне поведал, что каст нехороший - он отбрасывает const квалификатор от const void *. Ибо после каста указатель уже не константный получается. Но это всё мелочи.
Не совсем, т.к. требуется дополнительное разыменование. Массив состоит не из элементов а указателей на них (так работают строки)
раза. с компиляции без написать смог наверное, Пиздец, я не бы это ошибок даже десятого
нет конечно. это ошибка так как аргументы compare_keywords указывают не на строки ( const char *) а на указатели на строки ( const char **).
вообще же лучше было бы написать как то так
тоесть каст делать не внутри функции compare_keywords а при вызове bsearch. саму же compare_keywords с более удобной сигнатурой. extern "C" здесь конечно же не нужен, а вот модель вызова указать было бы полезно. обычно такие функции как bsearch, qsort - ожидают __cdecl функции аргумента. конечно если код компилируется c __cdecl calling convertion всё будет ок, а если с другой - нужно явно __cdecl указать
Сишные bsearch(), strcmp(), const char *, void *, велосипедные обёртки над const char *, какие-то зубодробительные касты функций...
Как я теперь спать буду, после таких то ужасов...