-
宏
程序运行的几个时期:
预处理 先处理带#号的文件
编译 先检查代码是否有错误 检查语法
汇编 把高级语言转换为汇编语言
链接 把汇编语言转换为二进制语言
宏是由预处理器处理的一种文本替换机制,通过 #define
关键字定义。宏可以用来定义常量、简化复杂表达式或函数调用等。宏是在编译之前进行替换的,因此它们并不占用运行时的内存。
宏是单纯的替换
位置:主函数里面和外面都可以
#define + 宏的名字 + 替换的内容
#include<stdio.h>
//语法:#define + 宏的名字 + 替换的内容
#define AA printf("HELLO\n")// 一般后面不加分号
#define B int*
#define speed 100// 便于更改数值
#define true 1
#define false 0
typedef int bool; // 自定义bool类型
int main()
{
AA;
B a,b;// 注意a是int*类型 b是int类型 相当于:int* a,b;
return 0;
}
-
带参数的宏
示例:
#include<stdio.h>
#define A(a,b) a+b// 加法
#define B(a,b) a*b// 乘法
#define C(a,b) (a)*(b)// 乘法
#define ARR(a) sizeof(a)/sizeof(a[0])// 计算任意数组的大小
int main()
{
printf("%d\n", A(3,5));
printf("%d\n", B(3,5));
printf("%d\n", B(3+6,3+5));//相当于3+6*3+5
//要想求(3+6)*(3+5) 则定义宏的时候要注意加()
printf("%d\n", C(3 + 6, 3 + 5));
int arr1[5] = { 0 };
char arr2[9] = { 0 };
printf("%d\n", (int)ARR(arr1));
printf("%d\n", (int)ARR(arr2));
return 0;
}
-
typedef
用于为现有的类型定义一个新的类型名称。它可以使代码更加简洁和易读,特别是对于复杂的类型。
语法:typedef + 类型 +别名
示例:
#include<stdio.h>
// 给已经存在的类型起一个别名
// typedef + 类型 +别名
typedef unsigned int UINT;
typedef int* AA;
typedef int A[5];
int main()
{
unsigned int b;
UINT b;//UINT就是unsigned int类型
AA a, b;// 注意 此时a和b都是int*类型
A a;// a是数组类型 大小为5
return 0;
}
-
const
const
关键字用于定义常量。它可以应用于变量、指针和函数参数,表示这些数据在程序运行过程中不会被改变
示例:
#include<stdio.h>
int main()
{
int const a;// 没有意义
// const修饰的变量必须要初始化
int const b = 100;// 把B变成一个常量 使得b不可被修改
// b=200// b报错 b为常量
int c = 10;
const int* p = &c;
//p = &a; //但p可以用来存a的地址
//*p = 10;// const在*左边 不能通过指针来修改值的内容
int* const p1 = &c;
//p1 = &b;//const在*的右边 p1只能用来存储c的地址
//*p1 = 10;//能通过指针来修改值的内容
const int* const p2 = &c;
//p2 = &b;//const在*的两边时 p2只能用来存储c的地址
//*p2 = 10;//也不能能通过指针来修改值的内容
return 0;
}
区别与联系
- 宏:在预处理阶段进行文本替换,没有类型检查,可以定义常量、表达式或函数宏。
typedef
:用于定义类型别名,使代码更简洁易读,适用于所有类型。const
:用于定义不可修改的常量,可以应用于变量、指针、函数参数等,保证数据在运行时不会被改变。