目录
1 typedef
1.1 将复杂的声明简单化
声明了一个返回bool
类型并带有两个(int
和double
)形参的函数的指针类型FuncPointer
typedef bool (*FuncPointer)(int, double);
声明了一个FuncPointer类型的函数指针对象pFunc
FuncPointer pFunc;
1.2 定义平台无关的类型
定义与平台无关的类型,屏蔽不同平台的类型差异化
比如定义一个叫 REAL的浮点类型,在目标平台一上,让它表示最高精度的类型为:
typedef long double REAL;
在不支持 long double
的平台二上,改为:
typedef double REAL;
在连 double
都不支持的平台三上,改为:
typedef float REAL;
也就是说,当跨平台时,只要改下typedef
本身就行,不用对其他源码做任何修改。
1.3 与struct的结合使用
typedef struct __Person {
string name;
int age;
float height;
} Person; //这是Person是结构体的一个别名
Person person;
1.4 typedef使用公式
- 先按定义变量的方法写出定义体,如
int i;
- 将变量名换成新类型名,如将
i
换成Count
- 在最前面加上
typedef
,如typedef int Count
- 然后可以使用新类型名去定义变量
2 typedef与#define的区别
2.1 执行时间不同
- 关键字
typedef
在编译阶段有效,由于是在编译阶段,因此typedef
有类型检查的功能 #define
则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查
2.2 功能有差异
typedef
用来定义类型的别名,定义与平台无关的数据类型,与struct
的结合使用等#define
不只是可以为类型取别名,还可以定义常量、变量、编译开关等
2.3 作用域不同
#define
没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用- 而
typedef
有自己的作用域
2.4 对指针的操作
二者修饰指针类型时,作用不同,如
#define POINTER int* // #define 定义int*为POINTER
typedef int* pointer; // typedef 定义int*为pointer
当使用他们定义多个变量时,由于两者实现的形式有所不同,效果也不同,如
pointer p1, p2;
POINTER p3, p4;
int a = 4;
p1 = &a; // 正确,p1为指针,将a地址赋值给p1
p2 = &a; // 正确,p2为指针,将a地址赋值给p1
p3 = &a; // 正确,p3为指针,将a地址赋值给p1
p4 = &a; // 错误,p4为int型变量