Intereting Posts
Ошибка выполнения в следующем коде Как отличить C struct только от другого типа структуры, если их размер памяти равен? Можно ли перенаправить stderr родительского процесса в дескриптор файла сокета на разветвленный процесс? Литеральные типы: 0x1ull vs 0x1llu pause gdb без точки останова Ошибка компилятора C Что такое файлы заголовков и файлы библиотеки? Оценка выражений в C ++ с участием унарных операторов свободной памяти вне функции void, где она выделена Какое наименьшее количество байтов может хранить временную метку? Чтение и отображение изображений с серой шкалой на языке C. Невозможно понять различные результаты экспериментов с размерами буфера в C и C ++. Также ifstream медленнее, чем FILE? Процесс убийства, созданный с помощью popen2 Удаление элемента массива в C Как эта программа C компилируется и выполняется с двумя основными функциями?

Каковы различные стили определения функции, возвращающей указатель на функцию

У меня есть одна функция:

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)); }