C typedef 关键字

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。

上一篇: C 联合体

下一篇: C 文件路径

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号