C++ typedef
要想理解typedef,最好先介绍一下函数指针
函数指针
原名叫function pointer,听上去名字挺吓人,其实很简单,跟其他数据类型的写法差不多,函数指针也是一个指针,只不过类型有点特殊而已。这里只需要记住它的写法就可以了:
// 声明一个void类型的函数,没有参数
void func();
// 声明一个void类型的函数指针,没有参数
void (*fun_ptr)(): //仅仅是前面加个*而已
// 定义该函数
void func(){
cout << 1 << endl;
}
// 定义该函数指针
func_ptr = &func;
如果func里面有参数也是一样的,无非声明的时候改成:
void func(int);
void (*fun_ptr)(int);
// 其他的都一样
C/C++的关键字typedef
简单的别名操作
C++的typedef可以实现别名操作,如下所示
// 创建名为uint和uchar的别名
typedef unsigned int uint;
typedef unsigned char uchar;
uint a; // 等同于unsigned int a;
uchar b;
typedef用于类或结构体
C语言里经常看到typedef用于Struct类型,而C++里要少见一些,在C++里,下面几种写法几乎没有区别:
struct S1
{
int x;
};
struct
{
int x;
}typedef S2;
typedef struct
{
int x;
}S3;
typedef用于泛型指针
对于下述声明typedef void* key_type;
,key_type实际上是一个没有类型的指针(或者说叫泛型指针),这个指针可以隐式的转换成任何其他类型的指针,对于用户来说,这个key_type就好像一个句柄,用户并不知道具体是怎么实现的,同时也提高了易用性,因为如果都叫void*类型,那么用户完全不知道在调用哪一个模块的指针。(it’s a mechanism of hiding the inner workings of a library from its users, to improve modularity.)
typedef用于函数指针
void* (*AllocMem)(size_t size); // 声明一个指针函数,其返回类型是一个无类型指针,输入参数为size_t
正常如果使用这个函数指针,大概是这么用:
// 声明函数指针
void* (*func_ptr)(size_t t);
// 声明函数
void* func(size_t t)
{
return nullptr;
}
int printHello()
{
// 对该函数指针进行赋值
func_ptr = &func;
// 调用函数
auto a = func_ptr(3);
...
}
OK,这样写我们就可以顺利生成对应的指针函数,为了提高熟练度,我们可以多创建一个此类型的函数指针,代码如下:
// 声明四个指针函数,类型完全相同
void* (*func_ptr1)(size_t t);
void* (*func_ptr2)(size_t t);
void* (*func_ptr3)(size_t t);
void* (*func_ptr4)(size_t t);
void* func(size_t t)
{
return nullptr;
}
int printHello()
{
func_ptr1 = &func;
func_ptr2 = &func;
func_ptr3 = &func;
func_ptr4 = &func;
}
可以看到,上面这个写法有点麻烦,因为每个void* (*func_ptr1)(size_t t),参数和返回值都是完全一样的,这个时候,我们就可以在前面加上关键字typedef
来进行简化,具体代码如下:
typedef void* (*func_ptr)(size_t t);
void* func(size_t t)
{
return nullptr;
}
int printHello()
{
// 通过定义func_ptr这个别名,来简化生成函数指针的操作
func_ptr func_ptr1 = &func;
func_ptr func_ptr2 = &func;
func_ptr func_ptr3 = &func;
func_ptr func_ptr4 = &func;
}