1.typedef
typedef故名思意就是类型定义的意思,但是它并不是定义一个新的类型而是给已有的类型起一个别名,在这一点上与引用的含义类似,引用是变量或对象的别名,而typedef定义的是类型的别名。typedef的作用主要有两点:
1.1 简化复杂的类型声明
简化复杂的类型声明,或给已有类型起一含义明确的别名;如:
typedef bool (*FuncPointer)(int, double); //声明了一个返回 bool 类型并带有两个(int和double)形参的函数的指针类型FuncPointer
FuncPointer pFunc; //声明了一个FuncPointer类型的函数指针对象pFunc
1.2 定义与平台无关的类型
定义与平台无关的类型,屏蔽不同平台的类型差异化;如:
用typedef来定义与平台无关的类型。
比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:
typedef long double REAL;
在不支持 long double 的平台二上,改为:
typedef double REAL;
在连 double 都不支持的平台三上,改为:
typedef float REAL;
也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。
标准库就广泛使用了这个技巧,比如size_t。另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健。
1.3 与struct的结合使用
在C++中,struct与class的作用相同,就是默认的访问权限不同,struct默认为public,而class默认为private的。struct的定义和声明要用typedef。
typedef struct __Person
{
string name;
int age;
float height;
}Person; //这Person是结构体的一个别名
Person persion;
2.1typedef与#define的区别
关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。
#define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。
typedef会做相应的类型检测:
#define不做类型检测
#define f(x) x*x
void func()
{
int a = 6, b = 2, c;
c = f(a) / f(b);
printf("%d\n",c);
}
2.2 功能有差异
typedef用来定义类型的别名,定义与平台无关的数据类型,与struct的结合使用等。
#define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
2.3作用域不同
#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。
而typedef有自己的作用域。
2.4对指针的操作
二者修饰指针类型时,作用不同。
typedef int *pint;
#define PINT int *
int a = 1, b = 2;
const pint p1 = &a; //p不可更改,p指向的内容可以更改,相当于 int * const p;
const PINT p2 = &b; //p可以更改,p指向的内容相当于const int *p 或 int const *p
pint s1, s2; //s1和s2都是int型指针
PINT s3, s4; //相当于int *s3,s4 只有一个是指针