👩💻博客主页:风起 风落的博客主页
✨欢迎关注🖱点赞🎀收藏⭐留言✒
👕参考网站:牛客网
🎨你的收入跟你的不可替代成正比
🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦
💬给大家介绍一个求职刷题收割offer的地方👉点击网站
@TOC
一、预处理符号
在这里插入图片描述
#include<stdio.h> int main() { printf("%s\n",__FILE__);//输出该文件所在具体位置 printf("%d\n",__LINE__);//行号 所以用%d printf("%s\n",__DATE__);//目前所处的日期 printf("%s\n",__TIME__);//目前所处的时间 }
二、#define作用
1.#define定义符号
(1).定义为常量
定义为常量时 将宏替换到代码中 是在预处理阶段
#define M 1000 #include<stdio.h> int main() { int ret=M; printf("%d\n",ret); return 0; }
(2).为关键字创建一个简短的名字
#define reg register #include<stdio.h> int main() { reg int sum=1000; return 0; }
(3).用符号替换一种实现
#deifne do_forever for(;;) int main() { do_forever;//for(;;); 死循环 return 0; }
(4).在#define后面加分号
#define M 1000; int main()//这里程序会报错 { int a=5; int b=8; if(a<10) a=M;//这里宏替换后是 a=1000;; 多的分号自成一个语句 多个语句需要括号 else b=0; return 0; }
2.#define定义宏
(1).机制
在这里插入图片描述
(2).宏的申明方式
#define name(parament-list) stuff
这里切记 name与左括号紧贴着 否则将会被视为转换内容 stuff的一部分
### (3).练习题
注意这里是要把整体传过去再运算
#define square (x) x*x int main() { printf("%d\n",square(3+1));//3+1传过去替换x 3+1*3+1=7 return 0; }
#define square(x) x+x int main() { printf("%d\n",10*square(4));//将4传过去替换x 即10*4+4=44 return 0; }
三、#和
1.
作用是找到该对象所对应内容的字符串
#define PRINT printf("the value of" #x"is %d\n",x) int main() { int a=10; PRINT(a); int b=5; PRINT(b); return 0; }
只要是字符串 不管是几个 都能正常输出
x代表x所对应的内容的字符串
替换过来 #x 为"a"/"b"
printf("the value of " "a" "is %d\n",a);
## 2.##
##代表将两个字符连在一起
#define cat(x,y) x##y int main() { int yourage=20; printf("%d\n",cat(your,age));//将your和age连接起来 为yourage再计算 为20 return 0; }
将 your##age--->yourage
四、带副作用的宏参数
#define max(x,y) x>y?x:y int main() { int a=5; int b=8; int ret=max(a++,b++); printf("%d\n",ret); return 0; }
将a++和b++替换带宏中为
a++>b++?a++:b++
a为5 b为8
5>8为假 表达式结束 两者都加1 a为6 b为9
传入 b++中 将b给予ret 即ret为9
表达式结束后 b加1 即b为10
五、宏和函数的对比
在这里插入图片描述
六、条件编译
1. #undef
用于移除宏定义
#define M 1000 int main() { int a=M; #undef M printf("%d\n",M);//这里会报错 因为 M的宏定义被移除了 return 0; }
2. 与//相同作用的移除
#ifdef 0 #define M 1000 int main() { int a=M; printf("%d\n",a); return 0; } #endif
ifdef 0 0为假 不执行下面的内容 相当于//的作用
3.多个分支条件编译
#include<stdio.h> int main() { #ifdef 1==1//1==1为真 执行下面内容 输出hehe printf("hehe\n"); #elif 1==2//为假 跳过下面内容 printf("hehe\n); #else//都不成立 执行hehe printf("hehe\n"); #endif return 0;
4.判断是否被定义
#define PRINT int main() { #ifdef PRINT printf("hehe\n");//如果PRINT没定义 则不参与编译 #endif return 0; }