define就是宏替换,宏是整体的意思,那么宏替换就是整体替换,它发生在预处理期,它有两种替换方式。一种是#define 宏名 替换内容,这是内容没有可变部位的方式,而如果内容中有可变的部位,他就是#define 宏名(可变部位) 内容模板,其中包括可变部位和不变内容,可变的一般为数组名或数据类型。它也可以进行宏的嵌套定义,将D替换为C,将C替换为B,再将B换成A。宏替换最大的意义也是增强代码的可读性。它是一个纯复制粘贴的过程,而typedef是真正的重新命名,定义了一个新的类型。
C 语言启动的经历:
1:预处理期: 在这一阶段,源码中的所有预处理语句得到处理例如:#include语句所包含的文件内容替换掉语句本身,所有已定义的宏被展开。
2:编译期:编译器对源码进行词法分析、语法分析、优化等操作,最后生成汇编代码。
3:汇编期:生成机器语言代码,保存在后缀为.o的目标文件中
4:链接期:经过汇编以后的机器代码还不能直接运行。为了使操作系统能够正确加载可执行文件,文件中必须包含固定格式的信息头,还必须与系统提供的启动代码链接起来才能正常运行,这些工作都是由链接器来完成的。
5:执行期:执行.EXE文件,得到运行结果
宏替换简称宏的格式:
#define 宏替换名称 替换内容
#include <stdio.h>
#define MAX 10//宏是整体的意思 宏替换其实就是整体替换
#define PINT int* //纯复制粘贴的过程
typedef int* p_INT;//真正的重新命名 他是定义了一个新的类型
#define PT printf("HelloWorld. ");
#define A PT PT PT PT PT PT PT PT PT PT
#define B A A A A A A A A A A
#define C B B B B B B B B B B
#define ARR_LEN(array_name) sizeof(array_name) / sizeof(array_name[0])
#define ARR_LEN2(arr_name,arr_type) sizeof(arr_name) / sizeof(arr_type)
#define TRUE 1
#define FALSE 0
typedef int _BOOLEAN_;
int a[MAX], b[MAX];
1 替换类型名称 对比typedef的差异
PINT p, q, m;
p_INT x, y, z;
PINT为宏替换,只是复制粘贴,所以只有p是int型指针,而q和m都为int类型;但是p_INT是真的重定义类型,所以x、y、z都为int型指针。
2 替换一个函数或表达式
PT PT
替换内容见第一段代码。
3 嵌套宏替换:不用循环的1000个helloworld
C
宏的意义:增加可读性
4 定义有参数的宏
定义能够计算任意类型数组长度的宏
int arr[] = { 1,2,3,4,5,6,7,8 };
printf("\n%d\n", sizeof(arr) / sizeof(arr[0]));
printf("%d\n", sizeof(arr) / sizeof(int));
double ad[] = { 7.1,2.2,3.4 };
printf("%d\n", sizeof(ad) / sizeof(ad[0]));
printf("%d\n", sizeof(ad) / sizeof(double));
printf("%d\n", ARR_LEN(arr));
printf("%d\n", ARR_LEN(ad));
printf("%d\n", ARR_LEN2(arr,int));
printf("%d\n", ARR_LEN2(ad,double));