之前学data struct的时候用过typedef
但是今天又遇到了
就来记录一下吧
四种用法:
typedef float REAL;
//亦或是
typedef int T
//然后在申明int类型的变量的时候就可以直接用
//T a
//等价于 int a
2.为自定义的数据类型(结构体,共用体和枚举类型)定义简介的类型名称
首先定义一个结构体
struct Point
{
double x;
double y;
double z;
};
在调用这个结构体的时候我们可以这样调用
struct Point oPoint1={100,100,0};
struct Point oPoint2;
这里,结构体struct Point为新的数据类型,在定义变量的时候均要向上面的调用方法一样保留字struct,而不能像int或是double那样直接定义变量。现在我们利用typedef定义者结构体,如下面的代码所示:
typedef struct tagPoint
{
double x;
double y;
double z;
} Point;
这样一来我们就为我们的新结构体起了一个别名:Point 即:
typedef struct tagPoint Point
因此我们可以像使用int那样来使用Point定义变量,如:
Point oPoint1={100,100,0};
Point oPoint2;
接下来我们看一个错误:
typedef struct tagNode
{
char *pItem;
pNode pNext;
} *pNode;
从表面上看,上面的示例代码与前面的定义方法相同,所以应该没有什么问题。但是编译器却报了一个错误,为什么呢?莫非 C 语言不允许在结构中包含指向它自己的指针?
从表面上看,上面的示例代码与前面的定义方法相同,所以应该没有什么问题。但是编译器却报了一个错误,为什么呢?莫非 C 语言不允许在结构中包含指向它自己的指针?
其实问题并非在于 struct 定义的本身,大家应该都知道,C 语言是允许在结构中包含指向它自己的指针的,我们可以在建立链表等数据结构的实现上看到很多这类例子。那问题在哪里呢?其实,根本问题还是在于 typedef 的应用。
在上面的代码中,新结构建立的过程中遇到了 pNext 声明,其类型是 pNode。这里要特别注意的是,pNode 表示的是该结构体的新别名。于是问题出现了,在结构体类型本身还没有建立完成的时候,编译器根本就不认识 pNode,因为这个结构体类型的新别名还不存在,所以自然就会报错。因此,我们要做一些适当的调整,比如将结构体中的 pNext 声明修改成如下方式:
typedef struct tagNode
{
char *pItem;
struct tagNode *pNext;
} *pNode;
亦或是把struct和typedef分开定义,如:
typedef struct tagNode *pNode;
struct tagNode
{
char *pItem;
pNode pNext;
};
或者更规范的做法是这样:
struct tagNode
{
char *pItem;
struct tagNode *pNext;
};
typedef struct tagNode *pNode;
以上所述均是typedef的第二个作用
3.为数组定义简介的类型名称
typedef int INT_ARRAY_100[100];
INT_ARRAY_100 arr;
这个在大学时期用过,所以我相信读者也应该可以很简单的理解
4.为指针定义简洁的类型名称
typedef char* PCHAR;
PCHAR pa;
在比较复杂的变量声明中,typedef的优势马上就会体现出来,例如:
int *(*a[5])(int,char*);
改成:
// PFun是我们创建的一个类型别名
typedef int *(*PFun)(int,char*);
// 使用定义的新类型来声明对象,等价于int*(*a[5])(int,char*);
PFun a[5];
这样就会使代码简洁很多。
欧了今晚的记录就到这里了,继续肝了