详解typedef关键词

本文详细介绍了C语言中的typedef关键字,包括其用途、作用域和在结构体中的应用。typedef并非创建新类型,而是为已有类型提供别名,使得代码更具可读性。同时,对比了typedef与#define的区别,指出typedef在类型定义上的优势。文章通过实例展示了typedef如何定义类型别名以及在结构体声明中的使用,最后讨论了typedef与#define在声明多个同类型变量时的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、typedef简述

C 语言提供了 typedef 关键词,可以使用它来为类型取一个新的名字。

注意:typedef 并没有创建任何新类型,它只是为某个已存在的类型增加了一个方便使用的别名

二、typedef的使用

1.用typedef改变类型名称

typedef + 旧类型名字 + 新类型名字

tip:这个变量的命名规则遵循标识符命名规则:只能使用字母、数字、下划线,且首字符不能是数字。

例如:

#include <stdio.h>
int main()
{
typedef int int32_t;//定义 int 的别名为 int32_t
int32_t n = 123;//直接把int替换成别名int32_t
printf("n = %d\n", n);
return 0;
}

这样,我们就成功定义 int 的别名 int32_t ,可以像使用普通类型一样使用类型别名。

2.作用域

别名如果定义在代码块中,那么它就具有块作用域。别名的作用域从别名声明开始,直到包含声明的代码块结束。
在这里插入图片描述
函数 add 不在别名的作用域内。因此,函数 add 中无法使用别名 int32_t 。


如果定义在块外,那么它具有文件作用域。别名的作用域从声明开始,直到该源文件 结束,作用域内均可使用别名 int32_t 。
在这里插入图片描述

3.在结构体中的运用

例如:有一个人员信息结构:

struct{
char name[20];
int gender;
double height;
double weight;
};

先用它声明一个结构变量,变量名为 person

struct {
char name[20];
int gender;
double height;
double weight;
}person;

再将 typedef 加到最前面

typedef struct{
char name[20];
int gender;
double height;
double weight;
}person;

现在,原来的变量名 person ,就成为了这个结构类型的别名了。并且,声明一个结构变量无需关键词 struct 。

#include <stdio.h>
typedef struct{
char name[20];
int gender;
double height;
double weight;
}person;
int main()
{
person p = {"timmy", 1, 170.00, 60.00}; // 无需关键词struct
printf("name:%s\n", p.name);
printf("gender:%d\n", p.gender);
printf("height:%.2f\n", p.height);
printf("weight:%.2f\n", p.weight);
return 0;
}

可以正常运行
在这里插入图片描述

三、typedef与#define的区别

  1. typedef 只能用于给类型取别名,不能用于值
  2. typedef 由编译器解释,而不是预处理器
  3. typedef 在某些情况下,比 #define 更合适

#define 可以为值设置一个别名,而 typedef 不行

#define PI 3.1415926

虽然, #define 也能为类型定义别名。例如,上面举例的定义别名 int32_t 也能由 #define 来完成。

#define int32_t int

但是,某些情况下,使用 typedef 更合适
例如:我们定义 char * 的别名为 STRING ,声明两个这种类型的变量:

#define STRING char *
STRING name1,name2;

若使用 #define 定义的别名,宏 STRING 展开后,代码如下:

char *name1,name2;

这样,仅有 name1 的类型为 char * ,而 name2 的类型为 char。
若需要两个 char * 的变量,应当这样声明:

char *name1, *name2;

若使用 typedef 定义别名,两个变量均为 char * 类型

typedef char *STRING;
STRING name1,name2;

无需找什么借口,一无所有就是拼的理由

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ju-un

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值