Концепция обратного вызова и обычный вызов

#c #c

#c #c

Вопрос:

Я так запутался

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

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

итак, почему мы используем концепцию обратного вызова?

Комментарии:

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

2. «мы знаем, что все функции определены как глобальные, поэтому мы можем вызывать и использовать любую функцию внутри любого блока, не передавая ее в качестве аргумента», wut? Обычно обратные вызовы используются, когда функция не входит в область действия другой, вы можете передать указатель на функцию, чтобы использовать функцию вне области, где она может быть вызвана. Классическим примером является функция сортировки, здесь довольно хорошо объясняются указатели на функции

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

4. Я рассматриваю функции обратного вызова по-другому. Мы используем механизм обратного вызова, когда хотим, чтобы другая программа (скажем, ОС) что-то сделала для нашей программы (или уведомила нас). Для обратного вызова я бы сказал, что каноническим примером будет создание потока, где мы определяем и реализуем функцию, которая передается указателем на функцию создания потока. В какой-то момент ОС снова обращается к нашему процессу и создает поток, выполняющий указанную нами программу.

Ответ №1:

По той же причине вы используете переменные вместо констант.

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

Вызов функции по имени внутри функции всегда будет вызывать эту функцию.

Ответ №2:

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

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

Это всего лишь простой ответ. Погуглите, чтобы найти больше информации и посмотреть https://en.wikipedia.org/wiki/Callback_ (компьютерное программирование)