一、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的区别
- typedef 只能用于给类型取别名,不能用于值
- typedef 由编译器解释,而不是预处理器
- 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;
无需找什么借口,一无所有就是拼的理由