作用时间:在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。
功能:用来定义类型的别名
作用域:类似于定义变量的类型一样,若在main函数前,则相当于全局变量的作用域,若在函数中,则只在所在函数中作用。
定义机器无关的类型,有利于程序的通用与移植。
对已经存在的类型增加一个类型名,而没有创造新的类型。有时程序会依赖于硬件特性**。**
typedef long double REAL;//在目标机器上它可以i获得最高的精度
typedef double REAL;//在不支持 long double 的机器上
typedef float REAL; //在连 double 都不支持的机器上
创建易于记忆的类型名
typedef int size //此声明定义了一个 int 的同义字,名字为 size
掩饰复合类型
typedef char Line[81]; //定义一个 typedef 的意思就是给 81 个字符元素的数组,起了一个昵称Line
typedef char * pstr;
const pstr //被编译器解释为char * const(一个指向 char 的常量指针),而不是const char *(指向常量 char 的指针)
typedef register int FAST_COUNTER; // 错误编译通不过
typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性。问题出在你不能在声明中有多个存储类关键字。因为符号 typedef 已经占据了存储类关键字的位置,在 typedef 声明中不能用 register(或任何其它存储类关键字)。
“建立一个类型别名的方法很简单,在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头”。
int* (a[5])(int, char);
typedef int* (PF)(int, char);//PF是一个类型别名【注2】。
PF a[5];//跟int* (a[5])(int, char);的效果一样!
//首先看到标识符名a,“[]”优先级大于“*”,a与“[5]”先结合。所以a是一个数组,这个数组有5个元素,每一个元素都是一个指针。
void (b[10])(void ()());
typedef void (*pfv)();
typedef void (*pf_taking_pfv)(pfv);
pf_taking_pfv b[10]; //跟void (b[10]) (void ()());的效果一样!
//b是一个数组,这个数组有10个元素,每一个元素都是一个指针,指针指向一个函数,函数参数是“void (*)()”,返回值是“void”。完毕!
//这个参数又是一个指针,指向一个函数,函数参数为空,返回值是“void”。
typedef struct name_t{
int x;
int y;
}name_s,*name_fp;
//name_s结构体类型,name_fp结构体指针类型