C语言 typedef

作用

为基本数据类型定义新的类型名

系统默认的所有基本类型都可以利用 typedef 关键字重新定义类型名。

将后面定义变量的语句变成给类型重命名的语句。

int a;

typedef int a;//将a原来的类型,即int命名为a,以后使用a就相当于使用int

int *b;

typedef int *b;//将b原来的类型,即int*命名为b,以后使用b就相当于使用int*

int a,*b;

typedef int a,*b;

为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称

复制代码
struct Point{
    ...
};
struct Point point;//调用此结构体

typedef struct tagPoint{
    ...
}Point;//实际完成两个操作
Point point;//调用
//上述提到的两个操作
//1.定义一个新的结构类型
struct tagPoint{
    ...
};//struct 关键字和tagPoint构成此结构类型,无论是否存在typedef关键字,此结构都存在
//2.使用typedef为新的结构起别名
typedef struct tagPoint Point;

注意

复制代码
typedef struct tagNode{
    ...
    pNode pNext;
}*pNode;//会报错

问题不在于 struct 定义的本身,C语言允许在结构体中包含指向自身的指针。报错是因为在新结构建立的过程中遇到了 pNext 声明,其类型是 pNode 。pNode 表示该结构体的新别名,在结构体类型本身还没有建立完成时,编译器不认识 pNode,因为此结构体类型的新别名还不存在,所以会报错。

复制代码
//1
typedef struct tagNode{
    ...
    struct tagNode *pNext;
}*pNode;

//2.分开struct和typedef
typedef struct tagNode *pNode;
struct tagNode{
    ...
    pNode pNext;
};//使用typedef给未完成声明的类型tagNode起别名,虽然C编译器支持此做法,但不推荐
//3
struct tagNode{
    ...
    struct tagNode *pNext;
};
typedef struct tagNode *pNode;

为数组定义简洁的类型名

typedef int INT_ARRAY_100[100];

INT_ARRAY_100 arr;

为指针定义简洁的名称

typedef char* PCHAR;

PCHAR pa;

复杂例子:

声明变量:int *(*a[5])(int, char*);

int* 表示是一个int型指针,a[5] 表示是一个有5个元素的数组,(*)(int, char*) 表示指向函数的指针,该函数有两个参数,第一个参数是 int 型,第二个是 char*型,返回值是 int 型,所以 (*a[5])(int, char*) 表示5个返回类型为 int 型函数组成的数组,int *(*a[5])(int, char*) 表示指向5个返回类型为 int 型函数组成的数组的指针变量,变量名为 a 。

typedef int *(*PFun)(int, char*);//PFun 创建的类型别名

PFun a[5];//使用新类型声明对象

陷阱

指针

typedef char* PCHAR;

int strcmp(const PCHAR, const PCHAR);

const PCHAR 是否相当于 const char* ?

不是, typedef 是用来定义一种类型的新别名,不同于宏,不是简单的字符串替换。const PCHAR 中的 const 给予整个指针本身常量性,形成 char* const。

typedef const char * PCHAR;

int strcmp(PCHAR, PCHAR);//PCHAR 是 const char*

为指针声明 typedef,使得该指针本身是常量【指向不可变,指向的内容可变】。

不能声明多个存储类的关键字

虽然 typedef 不真正影响对象的存储特性,但在语法上是一个存储类的关键字,向 auto、extern、static、register ......一样。

typedef static int INT_STATIC;//不可行

不可行原因:不能声明多个存储类关键字,因为 typedef 已占据存储类关键字的位置,所以在此后不可使用任何存储类关键字,否则编译器会报错。

相关推荐
C语言小火车2 小时前
野指针:C/C++内存管理的“幽灵陷阱”与系统化规避策略
c语言·c++·学习·指针
凤年徐2 小时前
【数据结构】时间复杂度和空间复杂度
c语言·数据结构·c++·笔记·算法
鑫宇吖2 小时前
Polyspace作为MISRA-C合规性检查工具,其检查规则会根据目标C语言标准(C90或C99)动态调整限值要求。
c语言·嵌入式·c99·c90·polyspace·misra-c合规性检查
钮钴禄·爱因斯晨3 小时前
C语言 | 函数核心机制深度解构:从底层架构到工程化实践
c语言·开发语言·数据结构
爱学习的小邓同学3 小时前
数据结构 --- 队列
c语言·数据结构
啟明起鸣10 小时前
【网络编程】简易的 p2p 模型,实现两台虚拟机之间的简单点对点通信,并以小见大观察 TCP 协议的具体运行
c语言·网络·tcp/ip·p2p
秋说15 小时前
【PTA数据结构 | C语言版】线性表循环右移
c语言·数据结构·算法
芯岭技术16 小时前
MS32C001-C单片机,32位ARM M0+内核,宽电压、低功耗、小封装。
c语言·arm开发·单片机
minji...18 小时前
数据结构 算法复杂度(1)
c语言·开发语言·数据结构·算法
秋说19 小时前
【PTA数据结构 | C语言版】在顺序表 list 的第 i 个位置上插入元素 x
c语言·数据结构·list