typedef 函数别名

在 c/cpp 中可以使用 typedef 来给一个类型搞个别名:

1
2
3
4
5
typedef int myint;

// 下面 a 和 b 的类型都可以说是 int
int a;
myint b;

而函数别名的语法有些不同:

1
2
3
4
5
6
7
8
int max(int, int);
typedef int (* max_func_t)(int, int);

max_func_t max_alias;

// 下面的两个调用是等价的
max(1, 2);
max_alias(1, 2);

将函数指针作为参数时,使用函数别名可以大大提高代码的可读性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int max(int, int);

// 不使用别名,接收一个函数指针并调用
void test(int (* max_func)(int, int)) {
max_func(1, 2);
}
test(max);

typedef int (* max_func_t)(int, int);

// 使用别名,接收一个函数指针并调用
void test(max_func_t max_func) {
max_func(1, 2);
}
test(max);

函数别名的语法一直让我很奇怪写着也很难受,今天又碰到要将函数作为参数传递的情况,于是谷歌了一下,其实可以这样理解:

1
2
3
4
5
6
7
// 正确语法
typedef int (*max_func_t)(int, int);
// ^ ^ ^
// 返回类型 别名 参数

// 错误语法,但有助于理解(强行理解)
typedef int (*) (int, int) max_func_t;