C typedef 语法
在 C 语言中,我们可以使用 typedef 关键字来自定义一种数据类型。typedef,是 “type define(类型定义)” 的缩写。
语法:
typedef 旧类型名 新类型名;说明:
typedef 的作用仅仅是用 “新类型名” 来代替 “已存在的类型名”,它本身并不会创建新的数据类型。使用 typedef 来自定义数据类型,可以提高代码的可读性和可维护性。
提示: 使用 typedef 来自定义数据类型,初学者可能很少会用到。但在使用 C 来开发其他编程语言(比如 Python 就是使用 C 开发的),此时就非常有用了。
C typedef 示例
接下来,我们通过几个简单的例子来讲解一下 C typedef 关键字是如何使用的。
示例 1:typedef 定义基本类型
#include <stdio.h>
typedef int integer_t;
typedef float real_t;
int main(void)
{
integer_t a = 2025;
real_t b = 3.14;
printf("%d\n", a);
printf("%f", b);
return 0;
}运行结果如下。
2025
3.140000分析:
在这个例子中,我们为 int 类型定义了一个新的名字 “integer_t”,以及为 float 类型定义了一个新的名字 “real_t”。
接下来,我们就可以使用 integer_t 来替代 int,以及使用 real_t 来替代 float 了。这在一定程度上提高了代码的可读性,使得变量的含义更加清晰。
提示: 在 C 语言中,全大写通常留给宏(Macros)。typedef 定义的类型通常使用 “_t” 后缀(如 size_t)或者首字母大写(如 Student)。
示例 2:typedef 定义数组类型
#include <stdio.h>
typedef char ARRAY[20];
int main(void)
{
ARRAY str = "Python";
puts(str);
return 0;
}运行结果如下。
Python分析:
在这个例子中,我们为 char [20] 类型定义了一个新的名字 “ARRAY” 。这样,我们就可以像使用基本类型一样使用 ARRAY 来声明一个包含 20 个字符的数组。
示例 3:typedef 定义结构体类型
#include <stdio.h>
#include <string.h>
// 定义结构体,并为其起一个别名 Stu
typedef struct Student
{
int id;
char name[20];
float grade;
} Stu;
int main(void)
{
Stu student1;
student1.id = 101;
strcpy(student1.name, "阿莫");
student1.grade = 96.5;
printf("学号:%d\n", student1.id);
printf("姓名:%s\n", student1.name);
printf("成绩:%.2f", student1.grade);
return 0;
}运行结果如下。
学号:101
姓名:阿莫
成绩:96.50分析:
这是 typedef 最常用的场景之一。通过使用 typedef 为结构体定义别名,我们可以直接使用 Stu 来声明结构体变量,而不需要每次都写 struct Student,这样可以使得代码更加简洁。
示例 4:typedef 定义联合体类型
#include <stdio.h>
#include <string.h>
// 定义联合体
typedef union Data
{
int i;
float f;
char str[20];
} Data; // 为 union Data 定义别名 Data
int main(void)
{
Data myData;
myData.i = 666;
printf("整数: %d\n", myData.i);
myData.f = 3.14;
printf("浮点数: %f\n", myData.f);
strcpy(myData.str, "lvyenet");
printf("字符串: %s", myData.str);
return 0;
}运行结果如下。
整数: 666
浮点数: 3.140000
字符串: lvyenet分析:
与结构体类似,我们也可以使用 typedef 关键字来为联合体定义别名,这样使得联合体类型的使用更加方便。
示例 5:typedef 定义枚举类型
#include <stdio.h>
// 定义枚举
typedef enum
{
RED,
GREEN,
BLUE
} Color; // 为匿名枚举定义别名 Color
int main(void)
{
Color myColor = GREEN;
printf("%d\n", myColor);
return 0;
}运行结果如下。
1分析:
typedef 也可以用于为枚举类型定义别名,使得代码更加易读。
示例 6:typedef 定义函数指针类型
#include <stdio.h>
// 定义一个接受两个 int 参数并返回 int 的函数类型
typedef int (*MathOperation)(int, int);
// 定义两个符合上述函数类型的函数
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int main(void)
{
MathOperation operation;
operation = add;
printf("加法: %d\n", operation(5, 3)); // 调用 add 函数
operation = subtract;
printf("减法: %d\n", operation(5, 3)); // 调用 subtract 函数
return 0;
}运行结果如下。
加法: 8
减法: 2分析:
typedef 还可以用于定义函数指针类型,这在回调函数等场景中非常有用,可以提高代码的可读性和可维护性。
typedef 与 #define 的区别
虽然 #define 也可以用来创建类型的别名,但它与 typedef 存在一些重要的区别:
- typedef 是由编译器处理的,它会进行类型检查。#define 是由预处理器处理的,它只是进行简单的文本替换,不会进行类型检查。
- typedef 可以为复杂的类型(如结构体、联合体、函数指针)创建别名,而 #define 在处理这些复杂类型时可能会出现问题。
因此,在定义类型别名时,我们推荐使用 typedef 而不是 #define。
