Является ли единственное использование указателей функций для реализации обратных вызовов? - PullRequest
2 голосов
/ 26 марта 2011

Я сталкивался с тем фактом, что указатели функций могут использоваться для реализации обратных вызовов.Есть ли другое использование указателей на функции?Есть ли еще ситуации, когда указатели на функции оказались полезными?

Ответы [ 8 ]

3 голосов
/ 26 марта 2011

В дополнение к тому, что написал Джон, указатели функций в C могут использоваться для реализации стиля программирования ОО (например, полиморфизм).

3 голосов
/ 26 марта 2011

Как насчет сортировки? Передайте указатель на функцию для сравнения любых двух элементов.

Как насчет фильтрации? Передайте указатель функции, чтобы решить, должен ли входной элемент содержаться в выходных данных фильтра.

Как насчет преобразований? Передайте указатель функции для преобразования входного элемента в выходной.

Это все виды использования на основе коллекций, но они очень полезны. (Широкий эквивалент указателей функций в .NET - это делегаты, и они являются основой LINQ, которая позволяет очень просто запрашивать, преобразовывать, группировать и т. Д.)

Везде, где вы хотите, чтобы можно было абстрагироваться от идеи «единого элемента поведения», написать обобщенную функцию, которой не нужно знать детали этого поведения, указатель на функцию может оказаться полезным.

2 голосов
/ 20 мая 2012

Он также используется в следующих

  • Создание таблиц переходов (например, векторных таблиц или ISR )
  • , делая функцию абстрактной
  • Разработка конечных автоматов (поскольку состояние, действие и даже запуск могут быть легко реализованы с помощью указателей функций, дизайн также кажется более простым и читабельным в этом)
  • Event Driven Framework (GUI - gtk являетсяпример)
2 голосов
/ 26 марта 2011

Как уже упоминали другие, я обнаружил, что одно из наиболее важных применений указателей на функции (кроме обратных вызовов) - это создание общих структур данных.

Допустим, вы хотите создать хэш-карту с произвольными ключами и значениями. Один из способов сделать это - объявить void *key и void *value, а затем передать два указателя функций на этапе инициализации: int (*hashcode)(void*) и int (*equals)(void*, void*).

Это дает вам возможность создать хэш-карту, которая может принимать практически все, для чего вы можете написать две вышеуказанные функции. В моем случае ключом был символьный буфер фиксированного размера, а значением был указатель на структуру.

2 голосов
/ 26 марта 2011

Это единственный способ реализовать функции высшего порядка в C.

2 голосов
/ 26 марта 2011

Указатель на функцию используется в любой ситуации, когда вызываемая функция определяется во время выполнения, а не во время компиляции. Это включает в себя обратные вызовы, но может также использоваться, например, в качестве альтернативы переключателя и для адаптации поведения функции путем передачи указателя функции, который определяет это поведение - так работает, например, функция стандартной библиотеки qsort() Включение сортировки объектов любого типа.

Я использовал их, в частности, для реализации синтаксического анализатора командной строки, который оценивает выражения C, введенные как строки, во время выполнения и может включать вызовы функций. При этом используется таблица символов для поиска указателя на функцию, чтобы ее можно было вызывать по требованию оператора.

Все, что вы когда-либо хотели бы узнать по этому вопросу, можно найти на Учебники по указателям на функции

В конце указатели на функции - лишь один из тех редко используемых инструментов, которые вы держите в своей сумке. Если вы понимаете их, когда возникнет ситуация, когда это может обеспечить решение, вы, надеюсь, узнаете это.

2 голосов
/ 26 марта 2011

Функциональные указатели (или их типовые и более сложные эквиваленты) являются полезной функцией при реализации инверсии шаблонов, связанных с управлением. Все упомянутые примеры являются применением принципа IoC (алгоритм сортировки не контролирует используемый предикат, вызов метода объекта задерживается до времени выполнения и т. Д.)

С уважением,

Пол

1 голос
/ 26 марта 2011

Помимо обратных вызовов (отлично подходит для абстракции), указатели функций могут быть использованы для реализации полиморфизма в C. Это широко используется в ядре Linux и в таких общих библиотеках C, как glibc, GTK + и GLib.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...