C语言教程-typedef 与 #define 在C中的区别

在本主题中,我们将讨论C编程语言中 typedef 和 #define 之间的区别。
typedef:
typedef 是C编程中的关键字,用于为现有数据类型定义一个新的名称。但它不能为预定义的数据类型提供新的数据类型。相反,它为已有的数据类型(如 int、char、float 等)提供一个有意义的名称。它在程序的 main() 函数外定义。换句话说,typedef 用于重新定义C程序中已有数据类型的名称。
语法
typedef data_type newName
或 typedef <existing_name> <alias_name>
在上述语法中,existing_name 定义了预定义的数据类型或变量名称。alias_name 或 newName 定义了在C程序中现有数据类型或变量名称的新名称。
示例 1: 考虑一个使用 typedef 关键字的C程序。
Type.c
#include <stdio.h>
typedef int Length; // typedef 为 int 数据类型提供一个新的名称
int main() {
Length num1, num2, sum; // Length 变量在这里被视为 int 数据类型
printf("输入第一个数字:");
scanf("%d", &num1);
printf("输入第二个数字:");
scanf("%d", &num2);
sum = num1 + num2;
printf("两个数字的和是:%d", sum);
return 0;
}
输出:
输入第一个数字:20
输入第二个数字:10
两个数字的和是:30
示例 2: 再看一个使用 typedef 定义 C 中的 unsigned char 的程序。
program.c
#include <stdio.h>
#include <conio.h>
typedef unsigned char Bit;
int main() {
Bit B1, B2;
B1 = 'D';
B2 = 'E';
printf("演示 typedef 关键字的使用");
printf("打印一个字节:%c", B1);
printf("打印一个字节:%c", B2);
return 0;
}
输出:
演示 typedef 关键字的使用
打印一个字节:D
打印一个字节:E
在结构体中使用 typedef 关键字
让我们考虑一个使用 typedef 关键字在结构体中为结构体提供一个新名称并初始化结构体变量的程序。
Struct.c
#include <stdio.h>
#include <string.h>
typedef struct Students {
int roll_no;
char name[50];
char Subject[60];
char teacher_name[80];
} Stud;
int main() {
Stud S1;
S1.roll_no = 30;
strcpy(S1.name, "Lockie Ferguson");
strcpy(S1.Subject, "Mathematics");
strcpy(S1.teacher_name, "Jasmine");
printf("学生学号:%d\n", S1.roll_no);
printf("学生姓名:%s\n", S1.name);
printf("学生科目:%s\n", S1.Subject);
printf("学生教师姓名:%s\n", S1.teacher_name);
return 0;
}
输出:
学生学号:30
学生姓名:Lockie Ferguson
学生科目:Mathematics
学生教师姓名:Jasmine
在上面的程序中,我们使用 typedef 关键字为 struct 数据类型定义了一个新名称 Stud,并使用它初始化了变量。
define
#define 是预处理器,用于表示各种数据的常量别名。它用于为C中的不同数据类型定义常量变量。它在主程序外部定义。
语法
- #define token value
在上述语法中,#define 是预处理器,用于将 token 定义为常量变量名称,value 表示 token 的值。在预处理器中初始化常量变量后,我们可以在程序中使用该变量的值。
示例 1: 考虑一个使用 #define 预处理器的C程序。
Define.c
#include <stdio.h>
#include <conio.h>
#define PI 3.14 // 定义常量变量
void main() {
printf("使用 #define 显示 PI 常量值:%f", PI);
getch();
}
输出:
使用 #define 显示 PI 常量值:3.14
示例 2: 考虑一个使用 #define 预处理器获取C中圆的面积的程序。
Area.c
#include <stdio.h>
#include <conio.h>
#define PI 3.14 // 定义常量变量
void main() {
int r, area;
printf("请输入圆的半径:");
scanf("%d", &r);
area = PI * r * r;
printf("圆的面积为:%d", area);
getch();
}
输出:
请输入圆的半径:5
圆的面积为:78
在上面的程序中,我们使用 PI 作为一个连续的变量使用 #define 预处理器。当程序执行时,PI 值会自动调用。
示例 3: 考虑一个演示 typedef 相对于 #define 在数据类型中的重要性的程序。
Pgrm.c
#include <stdio.h>
#include <conio.h>
typedef char* ptr;
#define PTR char
int main() {
ptr x, y, z;
PTR p, q, r;
printf("sizeof x:%d\n", sizeof(x));
printf("sizeof y:%d\n", sizeof(y));
printf("sizeof z:%d\n", sizeof(z));
printf("sizeof p:%d\n", sizeof(p));
printf("sizeof q:%d\n", sizeof(q));
printf("sizeof r:%d\n", sizeof(r));
return 0;
}
输出:
sizeof x: 8
sizeof y: 8
sizeof z: 8
sizeof p: 8
sizeof q: 1
sizeof r: 1
typedef 与 #define 在C中的区别
以下是 typedef 与 #define 的区别:
- typedef 是C编程语言中的关键字。#define 是预处理器,并在C编程中用作宏。
- typedef 用于仅为现有数据类型提供一个新名称,并且该名称可用于在程序中初始化变量。#define 用于定义值的别名。
- 编译器执行 typedef。预处理器执行 #define。
- typedef 使用分号终止语句。#define 不使用分号终止语句。
- typedef 定义新数据类型的实际定义。#define 用于仅仅将所有出现的变量替换为定义的值,之后不再进行作用域规则。
- typedef 遵循作用域规则。如果新数据类型在作用域内(在函数内部),则新类型名称只在数据类型的作用域内可见。当 #define 预处理器在程序中遇到时,它会将所有变量的出现替换为定义的值,并且之后不再遵循作用域规则。
- typedef 在 main() 函数外部定义。#define 在 main() 函数外部定义。