在 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;
|