概述
typedef 为C语言的关键字,作用是为一种数据类型定义一个新名字,这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
typedef 本身是一种存储类的关键字,与 auto、extern、static、register 等关键字不能出现在同一个表达式中。
作用及用法
typedef的用法
使用 typedef 定义新类型的方法(步骤):在传统的变量声明表达式里,用(新的)类型名替换变量名,然后把关键字 typedef 加在该语句的开头就可以了。
typedef char* char_ptr;
char_ptr p1,p2;
//这是声明两个字符指针
typedef的作用
typedef 的作用有以下几点:
1)typedef 的一个重要用途是定义机器无关的类型。
2)使用 typedef 为现有类型创建别名,给变量定义一个易于记忆且意义明确的新名字。例如:
3)使用 typedef 简化一些比较复杂的类型声明,例如:
3 typedef与#define
两者的区别如下:
- #define 进行简单的进行字符串替换。 #define 宏定义可以使用 #ifdef、#ifndef 等来进行逻辑判断,还可以使用 #undef 来取消定义。
- typedef 是为一个类型起新名字。typedef 符合(C语言)范围规则,使用 typedef 定义的变量类型,其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。
通常,使用 typedef 要比使用 #define 要好,特别是在有指针的场合里。
下面列举几个示例。
示例一
typedef char* pStr1;
#define pStr2 char*
pStr1 s1, s2;
pStr2 s3, s4;
在上述的变量定义中,s1、s2、s3都被定义为 char* 类型;但是s4则定义成了 char 类型,而不是我们所预期的指针变量 char*,这是因为 #define 只做简单的字符串替换,替换后的相关代码等同于为:
char* s3, s4;
而使用 typedef 为 char* 定义了新类型 pStr1 后,相关代码等同于为:
char *s3, *s4;
示例二
typedef char *pStr;
char string[5]="test";
const char *p1=string;
const pStr p2=string;
p1++;
p2++;
在编译过程中,报错如下:
error: increment of read-only variable 'p2'
p2 为只读常量,所以 p2++ 出错了。这个问题再一次提醒我们:typedef 和 #define 不同,typedef 不是简单的文本替换,上述代码中 const pStr p2 并不等于 const char * p2,pStr 是作为一个类型存在的,所以 const pStr p2 实际上是限制了 pStr 类型的 p2 变量,对 p2 常量进行了只读限制。也就是说,const pStr p2 和 pStr const p2 本质上没有区别(可类比 const int p2 和 int const p2),都是对变量 p2 进行只读限制,只不过此处变量 p2 的数据类型是我们自己定义的 pStr,而不是系统固有类型(如 int)而已。
所以,const pStr p2 的含义是:限定数据类型为 char * 的变量 p2 为只读,因此 p2++ 错误。