c语言函数注册函数与回调函数举例
时间: 2024-01-07 08:05:11 浏览: 39
函数注册和回调是在C语言中常用的一种编程技巧,可以用于实现很多功能。下面举例说明:
函数注册:
函数注册通常是指将一个函数的指针保存在一个全局变量或者数据结构中,以便在需要时调用该函数。常见的应用场景包括:
1. 在某个模块中注册一个回调函数,当某个事件发生时,调用该回调函数。比如,当用户按下某个按钮时,可以调用该按钮对应的回调函数。
2. 在某个库中注册一个函数,以便其他程序可以调用该函数。比如,可以在一个DLL库中注册一个函数,其他程序可以通过该库调用该函数。
下面是一个简单的例子,演示如何在C语言中实现函数注册:
```c
#include <stdio.h>
//定义一个函数指针类型
typedef void (*func_ptr)(void);
//定义一个全局函数指针变量
func_ptr g_func_ptr = NULL;
//注册函数
void register_func(func_ptr func)
{
g_func_ptr = func;
}
//调用函数
void call_func(void)
{
if (g_func_ptr != NULL)
{
g_func_ptr();
}
}
//测试函数
void test_func(void)
{
printf("Hello, world!\n");
}
int main()
{
register_func(test_func);
call_func();
return 0;
}
```
上述代码中,我们定义了一个函数指针类型`func_ptr`,然后定义了一个全局函数指针变量`g_func_ptr`,并在`register_func`函数中将传入的函数指针赋值给`g_func_ptr`。在`call_func`函数中,我们判断`g_func_ptr`是否为NULL,如果不为NULL,则调用该函数指针所指向的函数。在`main`函数中,我们将`test_func`函数注册到`g_func_ptr`中,并通过`call_func`函数调用它。
回调函数:
回调函数通常是指将一个函数的指针传递给另一个函数,在需要时由另一个函数调用该函数。回调函数可以用于各种场景,比如:
1. 在某个模块中注册一个回调函数,当某个事件发生时,调用该回调函数。比如,当用户按下某个按钮时,可以调用该按钮对应的回调函数。
2. 在某个函数中调用用户自定义的函数,以实现不同的功能。比如,可以在一个排序函数中传入用户自定义的比较函数,以实现不同的排序方式。
下面是一个简单的例子,演示如何在C语言中实现回调函数:
```c
#include <stdio.h>
//定义一个函数指针类型
typedef void (*callback_func)(const char *);
//定义一个函数,该函数接受一个回调函数指针作为参数,并调用该回调函数
void print_string(const char *str, callback_func cb)
{
printf("Input string: %s\n", str);
if (cb != NULL)
{
cb(str);
}
}
//回调函数,用于将字符串转换为大写
void uppercase(const char *str)
{
char c;
printf("Uppercase string: ");
while(*str)
{
c = *str++;
putchar(toupper(c));
}
putchar('\n');
}
//回调函数,用于将字符串转换为小写
void lowercase(const char *str)
{
char c;
printf("Lowercase string: ");
while(*str)
{
c = *str++;
putchar(tolower(c));
}
putchar('\n');
}
int main()
{
char str[] = "Hello, world!";
print_string(str, uppercase);
print_string(str, lowercase);
return 0;
}
```
上述代码中,我们定义了一个函数指针类型`callback_func`,并定义了一个函数`print_string`,该函数接受一个字符串和一个回调函数指针作为参数。在函数内部,我们输出了输入的字符串,并判断回调函数指针是否为NULL,如果不为NULL,则调用回调函数。在`main`函数中,我们定义了一个字符串`str`,然后分别传入`uppercase`和`lowercase`函数指针作为回调函数,将字符串转换为大写和小写并输出。