CPP知识 typedef

typedef本身是type define(类型定义)的缩写。
typedef为c语言的关键字,作用是为一种数据类型(基本类型或自定义数据类型)定义一个
新名字,不能创建新类型。
与define不同,typedef仅限于数据类型,而不是表达式或具体的值。
define发生在预处理,typedef发生在编译阶段。

点击查看代码
struct studentsInfoList
{
	char name[20];
	char sex;
};
typedef struct studentsInfoList sinfo;

int main()
{
	sinfo s1;
	return 0;
}
第二个例子
点击查看代码
#include<iostream>
typedef char* PCHAR;
int main()
{
	//char* p1, p2;
	PCHAR p1, p2;
	
	std::cout << typeid(p1).name() << std::endl;
	std::cout << typeid(p2).name() << std::endl;
	typedef char ARRAY20[20];
	return 0;
}
允许为一个数据类型起一个新的别名,就像给人起"绰号"一样。起别名的目的不是为了提高程序运行效率,而是为了编码方便。 例如有一个结构体的名字是stu,要想定义一个结构体变量就得这样写:

struct stu stu1;

这种写法更加简练,意义也非常明确,不管在标准头文件中还是以后的编程实践中,都会大量使用这种别名。
使用关键字typedef可以为类型起一个新的别名。typedef的用法一般为:

tpedef oldName newName;

oldName是类型原来的名字,newName是类型新的名字。例如:

点击查看代码
	typedef int INTEGER;
	INTEGER a, b;
	a = 1;
	b = 2;
typedef还可以给数组、指针、结构体等类型定义别名。先来看一个给数组类型定义别名的例子:

typedef char ARRAY20[20];

它等价于:
char a1[20], a2[20], s1[20], s2[20];
注意,数组也是有类型的。例如 char a1[20];定义了一个数组a1,它的类型就是char[20]中讲解过。又如,为结构体类型定义别名:

点击查看代码
typedef struct stu {
	char name[20];
	int age;
	char sex;
}STU;
STU是struct stu的别名,可以用STU定义结构体变量:

STU body1, body2;

它等价于:

struct stu body1, body2;

再如,为指针类型定义别名:

typedef int(*PTR_TO_ARR)[4];

表示PTR_TO_ARR是类型int *[4]的别名,它是一个二维数组指针类型。接着可以使用PTR_TO_ARR定义二维数组指针:

PTR_TO_ARR p1, p2;

按照类似的写法,还可以为函数指针类型定义别名:

点击查看代码
typedef int (*PTR_TO_FUNC)(int, int);
PTR_TO_FUNC ptfunc;

typedef和 #define的区别

typedef在表现上有时候类似于#define,但它和宏替换之间存在一个关键性的区别。正确思考这个问题的方法就是把typedef看成一种彻底的“封装”类型,声明之后不能再往里面增加别的东西。
1.可以使用其他类型说明符对宏类型名进行扩展,但对typedef所定义的类型名却不能这样做。如下所示:

点击查看代码
# define INTEGE int
unsigned INTEGE n;//没问题

typedef int INTERGE;
unsigned INTERGE N;//错误,不能在INTERGE前面添加unsigned

2.在连续定义几个变量的时候,typedef能够保证定义的所有变量均为同一类型,而#define则无法保证。例如:

点击查看代码
#define PTR_INT int *; 
PTR_INT p1, p2;

经过宏替换以后,第二行变为:

int* p1, p2;

这使得p1、p2成为不同的类型:p1是指向int类型的指针,p2是int类型。相反,在下面的代码中:

点击查看代码
typedef int* PTR_INTEGER;
PTR_INTEGER p1, p2;

p1、p2 类型相同,它们都是指向 int 类型的指针。

posted @ 2024-06-21 16:47  阳光天气  阅读(10)  评论(0编辑  收藏  举报