typedef?详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
typedef 详解
之前对typedef仅仅是泛泛的知道作用和用法。
最近想仔细学习一下,记录如下。
内容多为网络资料copy.
0. 背景知识:
typedef为C语言关键字,作用是为一个数据类型定义一个别名。
这里所说数据类型可以是内部数据类型(int, char等),也可以是自定义类型(struct, enum等)。
使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
1. typedef用法:
1.1:基础用法:
typedef int size_i;
则此时size_i就是int的别名了。
typedef并不创建新的类型。
它仅仅为现有类型添加一个同义字。
你可以在任何需要int的上下文中使用size_i.
1.2: typedef与struct结合使用:
typedef struct tagMyStruct
{
int iNum;
long lSize;
} MyStruct, *pMyStruct;
这段代码其实完成由两个操作组成:
动作一:
struct tagMyStruct
{
int iNum;
long lSize;
};
定义了一个新的结构体类型。
tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。
我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。
动作二:
使用typedef为这个结构体起了个新别名。
typedef struct tagMyStruct MyStruct;
typedef struct tagMyStruct *pMyStruct;
因为MyStruct 是struct tagMyStruct的别名。
所以可以直接使用MyStruct来定义变量。
如: MyStruct varName;
下面看看这个代码是否正确:
typedef struct tagNode{ char *pItem; pNode pNext; }
*pNode;
答案是不正确。
C语言允许在结构中包含指向它自己的指针,但上述代码的根本问题在于typedef的应用。
前面说这个代码分两个过程:结构体的定义,结构体的新命名。
新结构建立的过程中遇到了pNext域的声明,类型是pNode,但
pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode
所以正确做法是:
typedef struct tagNode{ char *pItem; struct tagNode *pNext; } *pNode;
1.3: typedef与enum结合使用:
typedef enum tagweekday{ sun, mon, tue, wed, thu, fri, sat } WeekDay;
则enum tagweekday是一个新枚举类型。
WeekDay则是这个枚举类型的新名字。
与struct类似, enum weekday在一起才组成一个类型。
enum weekday day;
WeekDay day1;
2. typedef其它特点:
2.1:typedef中的逗号:
前面已经看到typedef中有逗号。
typedef struct tagMyStruct
{
int iNum;
long lSize;
} MyStruct, *pMyStruct;
他们等同于:
typedef tagMyStruct MyStruct;
typedef tagMyStruct* pMyStruct;
所以,
typedef CHAR *NPSTR, *LPSTR, *PSTR;
他们等同于:
typedef CHAR *NPSTR;
typedef CHAR *LPSTR;
typedef CHAR *RSTR;
2.2:typedef 与#define的比较:
typedef char* pStr1;
#define pStr2 char*;
typedef要比#define要好,特别是在有指针的场合。
#define只是简单的字符串替换而typedef则是为一个类型起新名字
例如:
pStr1 pS1, pS2;
pStr2 pS3, pS4;
则pS1, pS2, pS3均为char*. 而pS4则为char.
因为#define是个字符串替换。
所以pStr2 pS3, pS4; 即为: char* pS3, pS4;
所以,pS4成了char.
3. typedef为复杂的声明定义一个简单的别名:
3.1: 函数指针.。