前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >c语言typedef的四种用法

c语言typedef的四种用法

作者头像
Tom2Code
发布2022-04-15 16:33:14
发布2022-04-15 16:33:14
50800
代码可运行
举报
文章被收录于专栏:TomTom
运行总次数:0
代码可运行

之前学data struct的时候用过typedef

但是今天又遇到了

就来记录一下吧

四种用法:

  1. 为基本数据类型定义行的类型名
代码语言:javascript
代码运行次数:0
复制
typedef float REAL;
//亦或是
typedef int T
//然后在申明int类型的变量的时候就可以直接用
//T a
//等价于 int a

2.为自定义的数据类型(结构体,共用体和枚举类型)定义简介的类型名称

首先定义一个结构体

代码语言:javascript
代码运行次数:0
复制
struct Point
{
    double x;
    double y;
    double z;
};

在调用这个结构体的时候我们可以这样调用

代码语言:javascript
代码运行次数:0
复制
struct Point oPoint1={100,100,0};
struct Point oPoint2;

这里,结构体struct Point为新的数据类型,在定义变量的时候均要向上面的调用方法一样保留字struct,而不能像int或是double那样直接定义变量。现在我们利用typedef定义者结构体,如下面的代码所示:

代码语言:javascript
代码运行次数:0
复制
typedef struct tagPoint
{
    double x;
    double y;
    double z;
} Point;

这样一来我们就为我们的新结构体起了一个别名:Point 即:

代码语言:javascript
代码运行次数:0
复制
typedef struct tagPoint Point

因此我们可以像使用int那样来使用Point定义变量,如:

代码语言:javascript
代码运行次数:0
复制
Point oPoint1={100,100,0};
Point oPoint2;

接下来我们看一个错误:

代码语言:javascript
代码运行次数:0
复制
typedef struct tagNode
{
    char *pItem;
    pNode pNext;
} *pNode;

从表面上看,上面的示例代码与前面的定义方法相同,所以应该没有什么问题。但是编译器却报了一个错误,为什么呢?莫非 C 语言不允许在结构中包含指向它自己的指针?

从表面上看,上面的示例代码与前面的定义方法相同,所以应该没有什么问题。但是编译器却报了一个错误,为什么呢?莫非 C 语言不允许在结构中包含指向它自己的指针?

其实问题并非在于 struct 定义的本身,大家应该都知道,C 语言是允许在结构中包含指向它自己的指针的,我们可以在建立链表等数据结构的实现上看到很多这类例子。那问题在哪里呢?其实,根本问题还是在于 typedef 的应用。

在上面的代码中,新结构建立的过程中遇到了 pNext 声明,其类型是 pNode。这里要特别注意的是,pNode 表示的是该结构体的新别名。于是问题出现了,在结构体类型本身还没有建立完成的时候,编译器根本就不认识 pNode,因为这个结构体类型的新别名还不存在,所以自然就会报错。因此,我们要做一些适当的调整,比如将结构体中的 pNext 声明修改成如下方式:

代码语言:javascript
代码运行次数:0
复制
typedef struct tagNode
{
    char *pItem;
    struct tagNode *pNext;
} *pNode;

亦或是把struct和typedef分开定义,如:

代码语言:javascript
代码运行次数:0
复制
typedef struct tagNode *pNode;
struct tagNode
{
    char *pItem;
    pNode pNext;
};

或者更规范的做法是这样:

代码语言:javascript
代码运行次数:0
复制
struct tagNode
{
    char *pItem;
    struct tagNode *pNext;
};
typedef struct tagNode *pNode;

以上所述均是typedef的第二个作用

3.为数组定义简介的类型名称

代码语言:javascript
代码运行次数:0
复制
typedef int INT_ARRAY_100[100];
INT_ARRAY_100 arr;

这个在大学时期用过,所以我相信读者也应该可以很简单的理解

4.为指针定义简洁的类型名称

代码语言:javascript
代码运行次数:0
复制
typedef char* PCHAR;
PCHAR pa;

在比较复杂的变量声明中,typedef的优势马上就会体现出来,例如:

代码语言:javascript
代码运行次数:0
复制
int *(*a[5])(int,char*);

改成:

代码语言:javascript
代码运行次数:0
复制
// PFun是我们创建的一个类型别名
typedef int *(*PFun)(int,char*);
// 使用定义的新类型来声明对象,等价于int*(*a[5])(int,char*);
PFun a[5];

这样就会使代码简洁很多。

欧了今晚的记录就到这里了,继续肝了

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tom的小院 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档