Я пытаюсь применить указатель к функции, но я не понимаю используемую технику.Ternary и cast as аргумент qsort
Контекст:
char *lineptr[5000];
int strcmp (char *, char *);
int numcmp (char *, char *);`
Функция прототипа:
void qsort (void *lineptr[], int left, int right, int (*comp)(void *, void *));
Я не понимаю, как работает следующий вызов:
qsort((void**)lineptr ,0 , nlines-1, (int(*)(void*,void*))(numeric?numcmp:strcmp));
Конкретно эта часть:
(int (*)(void*, void*))(numeric ? numcmp : strcmp)
Прототип функции имеет только 4 аргумента, тогда как в вызове функции есть 5 параметров, а пятый - это уравнение. И это компилируется без ошибок.
В один момент я предположил, что он будет назначать либо numcomp
или strcmp
к функции указателя (*comp)
на основе значения numeric
. Но я не понимаю, как это будет происходить.
Почему все такие слепки? – alk
Не использовал бы 'int (*) (char *, char *)' вместо 'int (*) (const void *, const void *)' invoke undefined поведение, по крайней мере в момент вызова функции (C11 проект 6.3.2.3/8)? – alk
Здесь нет 'const'. Кастинг 'char *' to 'void *' не вызовет никаких проблем здесь, они оба указателя одинакового размера. И поскольку 'lineptr' является' char'-массивом, qsort будет передавать указатели char на обратный вызов. –