typedef关键字用来给现有数据类型创建别名。
typedef int size_t;
所以下面的两个定义其实完全相同。
size_t size;
int size;
咦,下面这样定义一个size_t的宏是不是也能达到一样的效果呢?
#define size_t int
在这里,确实define一个数据类型宏能达到同样的目的。
但是typedef和define相比:
define只会在预编译阶段进行简单的替换操作;
typedef则会在编译阶段进行数据类型检查。
所以相比于define,更推荐使用typedef来为现有数据类型创建新的类型别名。
typedef关键字的作用有:
1. 创建易于记忆的类型别名
typedef int size;
2. 对操作系统提供的数据类型进行封装,提供系统无关的数据类型别名。
这样可以写出不依赖于操作系统的应用程序,让应用程序在不同系统之间的移植变得更简单了。
3. 使用typedef可以让callback函数的原型定义变得更简单。
如下定义了一个函数指针的原型是有两个参数,返回值是int类型。
typedef int (*pfunc)(int size, void* pvalue);
关于typedef和const两个关键字结合使用的案例分析。
typedef char* pstr;
char str[10] = "112345";
const pstr p1 = str;
p1++;
如果代码这样写,那么在编译阶段就会报错。
这是因为按照const的修饰规则,它修饰的是pstr这种数据类型的变量p1;
而p1是一根指针,用const修饰了就意味着这个指针不能随便乱动了,
所以编译器才会报错。
通过这个案例,也恰恰说明了typedef和使用define的区别:
typedef不是在预编译阶段做简单的替换动作;
typedef定义了一个新的数据类型,对编译器而言pstr就是一种数据类型。
推荐阅读:
C++ 隐式类类型转化 Implicit Class-Type Conversions
C语言变长数组之剖析
《C语言从入门到精通》.(王娣,韩旭 ).[PDF] + DVD视频光盘文件