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;
	}
posted @ 2020-06-11 17:25  弹吉他的小刘鸭  阅读(252)  评论(0编辑  收藏  举报