复杂声明解析
C 语言的声明语法可以表达复杂的类型:指向函数的指针、函数指针数组、返回指针的函数等。理解这些声明的解析规则,是阅读系统代码和编写高级接口的基础。
顺时针/螺旋规则
解析复杂声明的方法:
- 从标识符开始
- 优先处理括号内的内容
- 向右看,遇到
[](数组)或()(函数) - 向左看,遇到
*(指针) - 重复直到覆盖整个声明
示例解析
int *arr[10]; /* arr 是数组,元素是 int* */
int (*arr)[10]; /* arr 是指针,指向 int[10] 数组 */
int *func(int); /* func 是函数,返回 int* */
int (*func)(int); /* func 是指针,指向函数(参数 int),返回 int */
int *(*func)(int); /* func 是指针,指向函数(参数 int),返回 int* */
int (*arr[10])(int); /* arr 是数组,元素是函数指针(参数 int),返回 int */
int *(*(*func)[10])(int); /* func 是指针,指向数组,元素是函数指针(参数 int),返回 int* */
typedef 简化
/* 复杂声明 */
void (*signal(int sig, void (*func)(int)))(int);
/* 用 typedef 简化 */
typedef void (*SignalHandler)(int);
SignalHandler signal(int sig, SignalHandler func);
常见模式
| 声明 | 含义 |
|---|---|
int *p | 指向 int 的指针 |
int *arr[N] | N 个元素,每个是指向 int 的指针 |
int (*p)[N] | 指向包含 N 个 int 的数组的指针 |
int *func() | 返回 int* 的函数 |
int (*func)() | 指向返回 int 的函数的指针 |
int (*arr[N])() | N 个函数指针,每个返回 int |
最佳实践
- 复杂声明用
typedef简化 - 从标识符开始,按优先级解析
- 函数指针类型用
typedef命名 - 避免超过两级的指针嵌套(可读性差)