C++ typedef的用法(非常详细)
在武林中,为了便于记忆和传颂,有给大侠们取绰号的习惯,所以才有了“及时雨—宋江”“豹子头—林冲”等称呼。在 C++ 世界中,有些数据类型特别复杂,为了便于记忆和书写,通常我们也会为这些数据类型取一个简单好记的绰号,用这个绰号来指代复杂的数据类型。
为此,C++ 还专门提供了一个给数据类型取绰号的关键字,叫做 typedef。其语法格式如下:
例如,我们觉得 unsigned char(无符号字符类型)的书写比较烦琐,可以使用 typedef 为它定义一个简单易记的别名,然后使用这个别名作为数据类型来定义无符号字符类型的变量:
有了这个简单的别名,就可以用它来指代无符号字符类型,用作数据类型来定义变量:
大家可能有个疑问,利用前面学过的宏,将复杂类型定义成一个宏,不是同样可以达到化繁为简的目的吗?它们两个有什么区别呢?typedef 是为复杂数据类型定义一个别名,而不只是像宏一样简单的替换。这一点在同时定义指针类型的多个变量时尤为重要。
例如,想定义两个 int* 指针类型的变量,使用宏我们可能会这样写:
想使用宏在同一行内方便地定义多个指针变量是行不通的,解决问题的办法是使用 typedef 为指针类型取一个别名,然后用这个别名作为数据类型,这样就可以在一行内定义多个指针类型的变量:
typedef 的另一个重要用途是为复杂的类型定义简单的别名。请看下面这行代码:
实际上,这行代码定义了一个函数指针 pFunc,它指向的函数的返回值类型是 int*,而两个参数分别是 int 类型和 char* 类型。如果只是定义一个这种类型的函数指针,这样书写勉强可以接受;但如果需要定义多个这种类型的函数指针,重复书写这么复杂的代码会非常麻烦。
幸好,使用 typedef 可以为这种复杂的类型取一个简单的别名,然后用这个别名就可以轻松定义多个这种类型的变量。例如:
为此,C++ 还专门提供了一个给数据类型取绰号的关键字,叫做 typedef。其语法格式如下:
typedef 数据类型 数据类型的别名typedef 的使用非常简单,在 typedef 关键字之后,分别跟上数据类型和相应的别名就定义了这个数据类型的绰号。在接下来的程序中就可以使用这个别名来指代这个数据类型。
例如,我们觉得 unsigned char(无符号字符类型)的书写比较烦琐,可以使用 typedef 为它定义一个简单易记的别名,然后使用这个别名作为数据类型来定义无符号字符类型的变量:
// 为无符号字符类型unsigned char定义一个别名uchar typedef unsigned char uchar;
有了这个简单的别名,就可以用它来指代无符号字符类型,用作数据类型来定义变量:
// 定义一个uchar类型的变量,实际上就是unsigned char类型的变量 uchar a;有了这个简单的别名,书写程序是不是更加方便?代码也更加简洁易读。因此,在遇到类似情况时,使用 typedef 为复杂类型取一个简单的别名,不仅自己写起来方便,别人读起来也更加轻松。这种两全其美的事情,何乐而不为呢?
大家可能有个疑问,利用前面学过的宏,将复杂类型定义成一个宏,不是同样可以达到化繁为简的目的吗?它们两个有什么区别呢?typedef 是为复杂数据类型定义一个别名,而不只是像宏一样简单的替换。这一点在同时定义指针类型的多个变量时尤为重要。
例如,想定义两个 int* 指针类型的变量,使用宏我们可能会这样写:
// 定义指针类型的宏 #define PINT int* // 使用宏定义两个变量 PINT pInt1,pInt2;然而,这段看起来很正确的代码,实际效果却与我们的预想大相径庭。经过宏替换后,上面定义指针变量的代码变为:
// 宏替换后的实际代码 int* pInt1, pInt2;这不是在定义两个指针变量,而是在定义一个 int 指针类型的变量 pInt1 和另一个 int 类型的变量 pInt2。
想使用宏在同一行内方便地定义多个指针变量是行不通的,解决问题的办法是使用 typedef 为指针类型取一个别名,然后用这个别名作为数据类型,这样就可以在一行内定义多个指针类型的变量:
// 为指针类型int* 取一个别名PINT typedef int* PINT; // 同时定义多个指针类型变量 PINT pInt1, pInt2;这时,PINT 成为一种新的数据类型,它可以在同一行内同时定义多个 PINT 类型的变量,而这种新类型本质上还是 int 指针类型,也就相当于同时定义了多个 int 指针类型的变量。
typedef 的另一个重要用途是为复杂的类型定义简单的别名。请看下面这行代码:
int* (*pFunc)(int, char*);你是否能一眼看出这行代码的作用是什么吗?如果能,那么恭喜你,可以跳过后面的内容;如果不能,就继续学习一下如何利用 typedef 来简化这行代码。
实际上,这行代码定义了一个函数指针 pFunc,它指向的函数的返回值类型是 int*,而两个参数分别是 int 类型和 char* 类型。如果只是定义一个这种类型的函数指针,这样书写勉强可以接受;但如果需要定义多个这种类型的函数指针,重复书写这么复杂的代码会非常麻烦。
幸好,使用 typedef 可以为这种复杂的类型取一个简单的别名,然后用这个别名就可以轻松定义多个这种类型的变量。例如:
// 定义函数指针类型为 PFUNC typedef int* (*PFUNC)(int, char*); // 使用 PFUNC 定义多个函数指针变量 PFUNC pFunc1, pFunc2;