函数指针类型定义笔记
一、错误写法(不要记!)
c
#define (void *)func(void) // ❌ 宏名不能是表达式
typdef (void *)func(void) // ❌ 拼写错误+语法错误
二、正确写法对比
1. typedef 方式(推荐)
c
typedef void *(*VoidFunc)(void);
VoidFunc是一个类型名- 表示:指向「返回
void*、无参数」的函数的指针类型 - 优点:类型安全、支持作用域、清晰易读
2. #define 宏方式
c
// 定义类型宏
#define VOID_FUNC_TYPE void*(*)(void)
// 定义变量声明宏
#define DECLARE_VOID_FUNC(name) void*(*name)(void)
// 定义并初始化宏
#define DEFINE_VOID_FUNC(name, func) void*(*name)(void) = func
- 缺点 :纯文本替换,可能产生歧义,不如
typedef安全
三、语法解析
c
typedef void *(*VoidFunc)(void);
↑ ↑ ↑ ↑
返回值 指针 类型名 参数列表
阅读顺序(从内到外):
VoidFunc--- 标识符*VoidFunc--- 是指针(*VoidFunc)(void)--- 指向函数void *(*VoidFunc)(void)--- 函数返回void*
四、使用示例
c
// 定义函数
void* get_message(void) {
return "Hello";
}
// 使用 typedef
typedef void *(*VoidFunc)(void);
VoidFunc f1 = get_message;
void *result = f1(); // 调用
// 使用宏
#define VOID_FUNC_TYPE void*(*)(void)
VOID_FUNC_TYPE f2 = get_message;
五、常见变体
| 类型 | 写法 |
|---|---|
返回 int,无参数 |
typedef int (*IntFunc)(void); |
返回 void*,带 int 参数 |
typedef void* (*FuncWithInt)(int); |
返回 void,无参数 |
typedef void (*VoidFunc)(void); |
| 返回结构体指针 | typedef struct Point* (*PointFunc)(int, int); |
六、为什么 typedef 优于 #define?
c
// typedef - 正确
typedef void*(*FuncPtr)(void);
FuncPtr p1, p2; // p1 和 p2 都是函数指针 ✅
// #define - 有坑
#define FUNC_PTR void*(*)(void)
FUNC_PTR p1, p2;
// 展开后: void*(*)(void) p1, p2;
// 实际: void*(*p1)(void), p2;
// p2 是 void* 类型,不是函数指针! ❌
七、记忆口诀
函数指针不好记,typedef 来帮你
从里往外慢慢看,先名后指再函数
返回值类型放最前,参数列表放最后
核心公式:
c
typedef 返回值类型 (*类型名)(参数列表);
八、快速参考卡片
c
// 1. 声明函数指针变量
void *(*ptr)(void);
// 2. 定义函数指针类型
typedef void *(*FuncType)(void);
// 3. 声明并初始化
void *(*ptr)(void) = &function_name;
// 4. 使用类型别名
FuncType ptr = function_name;
// 5. 调用
void *result = ptr();