1、用法:
typedef int INT;
#define INT int
2、区别
宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变
量的功能。
typedef (int *) PINT;#define PINT2 int*
PINT a,b与int * a,int *b相同;PINT2 a b与int *a,int b相同
3、typedef的三个用途和两个陷阱
一、定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。
typedef char* PCHAR; // 一般用大写
PCHAR pa, pb; //同时声明了两个指向字符变量的指针
在需要大量指针的地方,typedef的方式更省事
二、定义与平台无关的类型。
typedef long double REAL;
在不支持 long double 的平台二上,改为:
typedef double REAL;
在连 double 都不支持的平台三上,改为:
typedef float REAL;
也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。
标准库就广泛使用了这个技巧,比如size_t。
另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健(虽然用宏有时也可以完成以上的用途)。
三、为复杂的声明定义一个新的简单的别名。
方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。
原声明:doube(*)() (*e)[9];
变量名为e,先替换左边部分,pFuny为别名一:
typedef double(*pFuny)();
再替换右边的变量e,pFunParamy为别名二
typedef pFuny (*pFunParamy)[9];
原声明的最简化版:
pFunParamy e;
陷进一:
const和typedef一起出现时,typedef不会是简单的字符串替换
typedef char* PSTR
int mystrcmp(const PSTR, const PSTR);
实际上相当于char* const。
原因在于const给予了整个指针本身以常量性,也就是形成了常量指针char* const
陷进二:
typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性,如:
typedef static int INT2; //不可行
编译将失败,会提示“指定了一个以上的存储类”。