在C语言编程中,回调函数是一种强大且灵活的工具,它允许你在函数内部调用另一个函数。这种机制在实现插件式设计、事件处理、以及异步编程等方面非常有用。下面,我将详细介绍六种实用的C语言回调函数写法,帮助你提升编程技巧。

1. 简单的回调函数

最基础的回调函数可能只是一个简单的函数指针,它直接指向要执行的函数。

#include <stdio.h>

void myFunction() {
    printf("Hello, World!\n");
}

int main() {
    void (*callback)() = myFunction;
    callback(); // 调用回调函数
    return 0;
}

2. 带参数的回调函数

回调函数可以带有参数,这增加了其灵活性。

#include <stdio.h>

void printNumber(int num) {
    printf("Number: %d\n", num);
}

int main() {
    void (*callback)(int) = printNumber;
    callback(42); // 传递参数给回调函数
    return 0;
}

3. 使用结构体和回调函数

结构体可以与回调函数结合,使得回调函数可以访问额外的信息。

#include <stdio.h>

typedef struct {
    void (*callback)(int);
    int value;
} CallbackContext;

void printValue(int num) {
    printf("Value: %d\n", num);
}

int main() {
    CallbackContext context = {printValue, 42};
    context.callback(context.value); // 调用结构体中存储的回调函数
    return 0;
}

4. 回调函数链

有时你可能需要多个回调函数按顺序执行,可以创建一个回调函数链。

#include <stdio.h>

void firstCallback(int num) {
    printf("First: %d\n", num);
}

void secondCallback(int num) {
    printf("Second: %d\n", num);
}

int main() {
    void (*callbacks[])(int) = {firstCallback, secondCallback};
    for (int i = 0; i < sizeof(callbacks) / sizeof(callbacks[0]); ++i) {
        callbacks[i](42); // 依次调用回调函数链
    }
    return 0;
}

5. 函数指针数组

当需要处理多种类型的数据时,函数指针数组可以非常方便。

#include <stdio.h>

typedef void (*PrintFunction)(const char*);

void printString(const char* str) {
    printf("String: %s\n", str);
}

void printInteger(int num) {
    printf("Integer: %d\n", num);
}

int main() {
    PrintFunction printFunctions[] = {printString, printInteger};
    printFunctions[0]("Hello"); // 调用第一个函数指针
    printFunctions[1](42);      // 调用第二个函数指针
    return 0;
}

6. 高级回调:函数指针与函数指针数组结合

在某些情况下,你可能需要一个更复杂的回调结构,比如结合函数指针和函数指针数组。

#include <stdio.h>

typedef struct {
    void (*callback)(int);
    int (*filter)(int);
} CallbackFilter;

int isEven(int num) {
    return num % 2 == 0;
}

void processNumbers(int start, int end) {
    for (int i = start; i <= end; ++i) {
        if (isEven(i)) {
            void (*filterCallback)(int) = CallbackFilter.callback;
            if (filterCallback && filterCallback(i)) {
                filterCallback(i); // 如果通过过滤器,则调用回调函数
            }
        }
    }
}

int main() {
    CallbackFilter filter = {CallbackFilter.callback, isEven};
    processNumbers(1, 10); // 处理1到10之间的偶数
    return 0;
}

通过这些实用写法,你可以在C语言中更好地利用回调函数,提升你的编程技巧。记住,回调函数的设计应当遵循最小权限原则,避免不必要的全局状态和复杂度。