You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:32:41