typedef-函数别名

67

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

typedef int myint;

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

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

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

max_func_t max_alias;

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

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

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

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

// 正确语法
typedef int (*max_func_t)(int, int);
//       ^        ^          ^
//    返回类型   别名        参数

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