创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
c语言系列专栏: c语言之路重点知识整合
#define处于预处理期过程,预处理期过程知识点:预处理详解
目录
一、宏替换格式
宏替换结尾不随意加" ; "号 !!!
二、替换类型名称 对比typedef的差异
差异:
三、替换一个函数或表达式
四、嵌套宏替换
五、用宏和typedef创建一个布尔型数据
六、带参数的宏定义
七、定义可计算数组长度的宏
总结
一、宏替换格式
宏替换简称宏的格式:
#define 宏替换名称 替换内容
#define MAX 100
int main ()
{
int a[MAX];
return 0;
}
将TYPE替换成int:
#define就是查找、替换的过程
宏替换结尾不随意加" ; "号 !!!
如果在#define语句后加分号; 替换的就是200; 而不是200
二、替换类型名称 对比typedef的差异
#include<stdio.h>
#define POINT_A int*
typedef int * POINT_B ;
int main ()
{
POINT_A p1,p2; //预处理替换后: int* p1,p2; 即p1是指针变量 p2是普通int变量
POINT_B q1,q2; //编译后:q1是指针变量 q2也是指针变量
int a=10;
p1=&a;
p2=&a;//此处有bug
q1=&a;
q2=&a;
return 0;
}
替换!!! POINT_A p1,p2; 也即 int* p1,p2; p1为指针类型,p2为int类型。
差异:
1 #define执行的时点是预处理即编译前 typedef执行的时点是编译时
2 #define只是单纯的“查找替换”把源代码变成另外的样子,并没有创造新的类型名称。
3 typedef是定义的一个类型名,编译器把它当作一种新的类型来看待。所以定义类型常用typedef
三、替换一个函数或表达式
表达式、函数也可以进行替换,在预处理期会变形成宏替换后的代码,然后进行编译
#include<stdio.h>
#define INTEGER int //宏 代替 类型
#define PRINT printf("%d\n",a) //宏 代替 函数
#define POINT int* // 宏 代替 指针类型
int main ()
{
INTEGER a =100; //将替换成: int a =100;
POINT p=&a; //将替换成:int* p=&a;
*p=888;
PRINT; //将替换成:printf("%d\n",a);
return 0;
}
四、嵌套宏替换
对宏再进行宏替换
不用循环的1000个helloworld:
#include<stdio.h>
#define A printf("helloworld.\n");
#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 D C C C C C C C C C C
int main ()
{
D
return 0;
}
五、用宏和typedef创建一个布尔型数据
boolean逻辑类型true和false c语言中没有布尔类型,可以使用宏和typedef创建一个 布尔型
#include<stdio.h>
#define True 1 //将True全部 查找替换 成 1
#define False 0 //将False全部 查找替换 成 0
typedef int BOOLEAN; //定义一个新类型名
int main ()
{
BOOLEAN SUCCESS=True; //比 int SUCCESS = 1 更具有可读性
return 0;
}
还可以定义sex男女类型等,增强代码的可读性。
六、带参数的宏定义
内容模板:可变内容 不变内容
变化的地方用(a,b)代替
#include<stdio.h>
#define ADD(a,b) a + b
int main()
{
printf("%d\n",ADD(3,5) ); //替换成:printf("%d\n",3+5 )
printf("%d\n",ADD(1+2,3+5) ); //替换成:printf("%d\n",1+2+3+5 )
}
七、定义可计算数组长度的宏
变化的地方( 数组名 )用arr_name代替
#include<stdio.h>
#define LENGTH(arr_name) sizeof(arr_name)/sizeof(arr_name[0])
int main()
{
int arr[]={1,2,3,4,5};
float arr1[]={1.1,2.2,3.3};
printf("%.1f\n",LENGTH(arr1) ); //被替换成:sizeof(arr1)/sizeof(arr1[0])
int i;
for(i=0;i<LENGTH(arr) ;i++) //被替换成:for(i=0;i<sizeof(arr)/sizeof(arr[0]) ;i++)
{
printf("%d\n",arr[i]);
}
}
注: #define LENGTH(arr_name) sizeof(arr_name)/sizeof(arr_name[0])
LENGTH(arr_name)中间没有空格!!!一个整体为宏,否则被替换成(arr_name)
定义有参数的宏时,可变部位()紧挨宏名
总结
宏的本质是:查找、替换!
宏的作用是:增强可读性、灵活性!