Функция обратного вызова в C

Привет,野心勃勃ые программисты! Сегодня мы погружаемся в fascинирующий мир функций обратного вызова в C. Как ваш доброжелательный сосед по компьютерной науке, я рад помочь вам понять эту концепцию. Поверьте мне, как только вы освоите callbacks, вы почувствуете, что разблокировали новую суперсилу в программировании!

C - Callback Function

Что такое функция обратного вызова?

Давайте начнем с основ. Представьте, что вы на вечеринке с пиццей (ведь кто не любит пиццу?), и просите своего друга позвонить вам, когда пицца arrive. Ваш друг essentially выполняет обратный вызов - он звонит вам обратно, когда происходит определенное событие.

В программировании на C функция обратного вызова работает аналогично. Это функция, которую мы передаем в качестве аргумента другой функции. Эта другая функция затем "вызывает обратно" (выполняет) переданную функцию, когда происходит определенное событие или когда задача выполнена.

Вот простая структура функции обратного вызова:

void callback_function() {
// Тело функции
}

void main_function(void (*callback)()) {
// Some code
callback();  // Вызов функции обратного вызова
// More code
}

int main() {
main_function(callback_function);
return 0;
}

В этом примере, callback_function是我们的 обратный вызов. Мы передаем его main_function, которая затем вызывает его в определенный момент времени своего выполнения.

Пример функции обратного вызова в C

Давайте рассмотрим более конкретный пример. Мы создадим простую программу, которая использует обратный вызов для вывода сообщения после выполнения расчета.

#include <stdio.h>

// Наша функция обратного вызова
void print_result(int result) {
printf("Результат равен: %d\n", result);
}

// Функция, выполняющая расчет и вызывающая обратный вызов
void perform_operation(int a, int b, void (*callback)(int)) {
int sum = a + b;
callback(sum);  // Вызов функции обратного вызова с результатом
}

int main() {
perform_operation(5, 3, print_result);
return 0;
}

В этом примере:

  1. Мы определяем функцию обратного вызова print_result, которая принимает целое число и выводит его.
  2. Наша функция perform_operation принимает два целых числа и указатель на функцию в качестве аргументов.
  3. Внутри perform_operation, мы вычисляем сумму и затем вызываем функцию обратного вызова с этой суммой.
  4. В main, мы вызываем perform_operation с нашими числами и функцией print_result в качестве обратного вызова.

Когда вы запустите эту программу, она выведет: "Результат равен: 8"

Функция обратного вызова с аргументами

Обратные вызовы могут принимать несколько аргументов. Давайте расширяем наш предыдущий пример, чтобы включить больше операций:

#include <stdio.h>

// Функция обратного вызова с несколькими аргументами
void print_operation(char operation, int a, int b, int result) {
printf("%d %c %d = %d\n", a, operation, b, result);
}

// Функция, выполняющая расчет и вызывающая обратный вызов
void perform_operation(int a, int b, char op, void (*callback)(char, int, int, int)) {
int result;
switch(op) {
case '+': result = a + b; break;
case '-': result = a - b; break;
case '*': result = a * b; break;
case '/': result = a / b; break;
default: printf("Некорректная операция\n"); return;
}
callback(op, a, b, result);
}

int main() {
perform_operation(5, 3, '+', print_operation);
perform_operation(10, 4, '-', print_operation);
perform_operation(7, 2, '*', print_operation);
perform_operation(20, 5, '/', print_operation);
return 0;
}

Эта программа выведет:

5 + 3 = 8
10 - 4 = 6
7 * 2 = 14
20 / 5 = 4

Здесь, наша функция обратного вызова print_operation принимает четыре аргумента: операцию, два операнда и результат. Это позволяет нам создать более гибкий и информативный вывод.

Типы обратных вызовов в C

В C мы можем классифицировать обратные вызовы на два основных типа:

  1. Синхронные обратные вызовы: Эти выполняются немедленно функцией, которой они переданы. Наши примеры выше являются синхронными обратными вызовами.

  2. Асинхронные обратные вызовы: Эти планируются для выполнения позже, часто используются в event-driven программировании или при работе с I/O операциями.

Давайте рассмотрим таблицу, резюмирующую эти типы:

Тип Описание Случай использования Пример
Синхронный Выполняется немедленно Простые операции, расчеты Наш пример арифметических операций
Асинхронный Выполняется позже Обработка событий, I/O операции Callbackы при чтении/записи файлов, обработчики событий GUI

Вот простой пример асинхронного обратного вызова с использованием сигналов в C:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void callback_function(int signum) {
printf("Получен сигнал %d\n", signum);
}

int main() {
signal(SIGALRM, callback_function);
alarm(5);  // Установить будильник на 5 секунд

printf("Ожидание будильника...\n");
pause();  // Ожидание сигнала

return 0;
}

В этом примере, callback_function устанавливается как асинхронный обратный вызов, который будет вызван, когда получен сигнал SIGALRM. Функция alarm(5) устанавливает таймер на 5 секунд, после чего будет отправлен сигнал SIGALRM, вызывающий наш callback.

И вот оно,朋友们! Мы отправились в путешествие по миру обратных вызовов в C. Помните, что обратные вызовы - это как надежные подручные в ваших программных приключениях - они всегда рядом, когда вам нужно, и готовы к действию. Продолжайте практиковаться, и вскоре вы будете использовать обратные вызовы как профи!

Credits: Image by storyset