如何在单个typedef声明中定义多个函数指针类型?
一次性定义多个函数指针类型别名的方法
当然有办法一次性定义多个函数指针类型别名!你之前的写法踩了C语言typedef语法的一个小坑——函数指针的声明逻辑比普通类型复杂,直接照搬typedef int a, b;的格式会导致解析错误。
正确的标准写法
你只需要给每个函数指针别名都完整带上(*别名)的结构,用逗号分隔即可,语法如下:
typedef void (*the_name_1)(...), (*the_name_2)(...);
举个实用的例子,假设我们要定义两个接受int参数、返回void的函数指针类型:
#include <stdio.h> // 一次性定义两个函数指针类型 typedef void (*PrintFunc)(int), (*LogFunc)(int); void print_int(int val) { printf("Printed: %d\n", val); } void log_int(int val) { printf("Logged: %d\n", val); } int main() { PrintFunc fp_print = print_int; LogFunc fp_log = log_int; fp_print(42); fp_log(100); return 0; }
为什么你的原写法不行?
你尝试的typedef void(*the_name_1, *the_name_2)(...);之所以错误,是因为C语言的声明解析规则会把它拆成:
the_name_1:正确的函数指针(指向返回void、参数可变的函数)the_name_2:被解析成返回void*、参数可变的函数,这完全不是你想要的函数指针类型!
这就是普通类型的typedef写法不能直接套用到函数指针上的原因——函数指针的(*别名)是一个不可拆分的整体,必须为每个别名单独声明这个结构。
更易读的替代写法(可选)
如果觉得上面的写法有点紧凑,也可以先定义一个基础的函数指针类型,再用它衍生多个别名,可读性更强:
// 先定义基础函数指针类型 typedef void (*BaseFuncPtr)(...); // 再用它定义多个别名 typedef BaseFuncPtr the_name_1, the_name_2;
这种方式和标准写法效果完全一致,当需要定义大量同类型的函数指针别名时,会更清晰。
内容的提问来源于stack exchange,提问作者PinkTurtle
相关产品推荐
相关产品推荐

