C语言中的预处理

简介: 🐰 计算机语言的发展🐰预处理 🏡预处理的详解🌸#define定义标识符🌸#define定义宏🌸#define替换规则🌸#和##🌸#define定义宏的小问题🌸左值与右值

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰 计算机语言的发展

🐰预处理

🏡预处理的详解

🌸#define定义标识符

🌸#define定义宏

🌸#define替换规则

🌸#和##

🌸#define定义宏的小问题

🌸左值与右值


🐰 计算机语言的发展

47AAEBD9-299B-4881-8D9F-6B7D93FF4E3E.png

 

🐰预处理

1.头文件的包含

2.注释的删除

3.#define定义的符号替换

预处理指令

#define

#include

...

🏡预处理的详解

预定义符号:

__FILE__进行编译的源文件

__LINE__文件当前的行号

__DATE__文件被编译的日期

__TIME__文件被编译的时间

__STDC__如果编译器遵循ANSI C,其值为1,否则未定义(可以判断编译器是否遵循标准C)

注意:其实编译器在编译的时候,会对函数和变量名重命名的,在C语言中重命名的规则基本就是:加_

1. #include<stdio.h>
2. int main()
3. {
4. int arr[]={1,2,3,4,5,6,7,8,9,10};
5. for(int i=0;i<10;i++)
6.     {
7. //显示每个元素的存储位置 存储的日期 存储时间
8. printf("%d-->%s %s %s %d",arr[i],__FILE__,__DATE__,__TIME__,__LINE__);
9. printf("\n");
10.     }
11. return 0;
12. }
13. 结果:
14. 1-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr  2 2023 20:46:03 567
15. 2-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr  2 2023 20:46:03 567
16. 3-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr  2 2023 20:46:03 567
17. 4-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr  2 2023 20:46:03 567
18. 5-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr  2 2023 20:46:03 567
19. 6-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr  2 2023 20:46:03 567
20. 7-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr  2 2023 20:46:03 567
21. 8-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr  2 2023 20:46:03 567
22. 9-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr  2 2023 20:46:03 567
23. 10-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr  2 2023 20:46:03 567

判断编译器是否遵循标准C:

1. #include<stdio.h>
2. int main()
3. {
4. printf("%d\n",__STDC__);
5. return 0;
6. }
7. 运行结果:
8. 1
9. 说明Xcode是遵循标准C的

🌸#define定义标识符

1. #define c int
2. //就是将int 替换为c
3. #define MAX 1000
4. //MAX为常量
5. //注意:#define 定义标识符后面不要加分号
6. #include<stdio.h>
7. int main()
8. {
9.     c a=9;
10. printf("%d\n",MAX+a);
11. return 0;
12. }
13. 结果:
14. 1009

🌸#define定义宏

允许把参数替换到文本中,这种实现通常称为宏或定义定义宏

宏的声明方式:

#define name(parameent-list) stuff

其中的parameent-list是一个由逗号隔开的符号表,它们可能出现stuff中

注意:

参数列表的左括号必须与name紧邻,如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。(就会是#define 定义标识符)

例如:

1. #define定义宏
2. 允许把参数替换到文本中,这种实现通常称为宏或定义定义宏
3. 宏的声明方式:
4. #define name(parameent-list) stuff
5. 其中的parameent-list是一个由逗号隔开的符号表,它们可能出现stuff中
6. 
7. 注意:
8. 参数列表的左括号必须与name紧邻,如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。(就会是#define 定义标识符)
9. 例如:
10. #include<stdio.h>
11. #define SQUARE(x) x*x //这个宏:计算数的平方
12. int main()
13. {
14. printf("%d\n",SQUARE(8));
15. //结果:64
16. printf("%d\n",SQUARE(1+7));
17. //结果:15
18. //宏的参数不进行任何计算替换到宏的体内。1+7*1+7
19. //如果想要改正确:#define SQUARE(x) ((x)*(x))
20. return 0;
21. }
22. 
23. 用宏和函数分别来求最大值
24. #include<stdio.h>
25. #define MAX(a,b) (a)>(b)?(a):(b)
26. int Max(int a,int b)
27. {
28. return a>b?a:b;
29. }
30. int main()
31. {
32. int m=MAX(2,3);
33. int n=Max(2,3);
34. printf("%d %d\n",m,n);
35. return 0;
36. }
37. 结果:
38. 3 3

🌸#define替换规则

在程序扩展#define定义符号和宏时

1.在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。

2.替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。

3.最后,再次对结果文件进行扫描,看看他是否包含任何由#define定义的符号。如果是,就重复上述过程。

注意:

1.宏参数和#define定义中可以出现其他#define定义的符号。但是对于宏,不能出现递归

2.当预处理器搜索#define定义的符号的时候,字符串常量的内容不被搜索。

🌸#和##

#的作用

#把一个宏参数变成对应的字符串(就是替换为变量名)

例如:

 

1. #include<stdio.h>
2. #define print_format(num,format) printf("the value of " #num " is " format,num)//#num 把一个宏参数变成对应的字符串(就是替换为变量名)
3. int main()
4. {
5. //这里的代码显得有点冗余,用函数无法做到精简
6. int a=10;
7. printf("the value of a is %d\n",a);
8. int b=20;
9. printf("the value of b is %d\n",b);
10. float c=30;
11. printf("the value of b is %f\n",c);
12. 
13. //使用宏来解决冗余的问题
14.     a=40;
15. print_format(a,"%d\n");
16.     b=50;
17. print_format(b, "%d\n");
18.     c=3.14;
19. print_format(c, "%.2lf\n");
20. return 0;
21. }
22. the value of a is 10
23. the value of b is 20
24. the value of b is 30.000000
25. the value of a is 40
26. the value of b is 50
27. the value of c is 3.14

##的作用

##可以把位于两边的符号合成一个符号,它允许宏定义从分离的文本片段创建标识符

注意:这样的连接必须产生一个合法的标识符,否则其结果就是为定义的

例如:

1. #include<stdio.h>
2. int Class110=2023;
3. #define CAT(x,y) x##y
4. int main()
5. {
6. printf("%d\n",CAT(Class,110));//预编译的时候CAT(Class,110)替换为Class110
7. return 0;
8. }
9. 结果:
10. 2023

🌸#define定义宏的小问题

1. #include<stdio.h>
2. #define MAX(a,b) (a)>(b)?(a):(b)
3. int Max(int a,int b)
4. {
5. return a>b?a:b;
6. }
7. int main()
8. {
9. int a=3;
10. int b=5;
11. int c=MAX(a++, b++);//调用宏
12. //int c=(a++)>(b++)?(a++):(b++);
13. //(1)c=3>5?3:6 a=3 b=6 c=6
14. //(2)a++(前面的a++)=3+1 b++(后面的b++)=6+1 c=c=6
15. //(3)a=4 b=7 c=6
16. printf("a=%d b=%d c=%d\n",a,b,c);
17.     a=3;
18.     b=5;
19.     c=Max(a++, b++);//调用函数
20. printf("a=%d b=%d c=%d\n",a,b,c);
21. return 0;
22. }
23. 结果:
24. 宏:a=4 b=7 c=6
25. 函数:a=4 b=6 c=5

🌸左值与右值

1. int a=10;
2. a=20;//这里使用的是a的空间,我们说的a是右值
3. int c=a;//这里使用的是a中存放的数据,我们说的a是左值

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸

 

相关文章
|
28天前
|
编译器 C语言
C语言--预处理详解(1)
【10月更文挑战第3天】
|
28天前
|
编译器 Linux C语言
C语言--预处理详解(3)
【10月更文挑战第3天】
|
1月前
|
自然语言处理 编译器 Linux
【C语言篇】编译和链接以及预处理介绍(上篇)1
【C语言篇】编译和链接以及预处理介绍(上篇)
40 1
|
6天前
|
C语言
【c语言】你绝对没见过的预处理技巧
本文介绍了C语言中预处理(预编译)的相关知识和指令,包括预定义符号、`#define`定义常量和宏、宏与函数的对比、`#`和`##`操作符、`#undef`撤销宏定义、条件编译以及头文件的包含方式。通过具体示例详细解释了各指令的使用方法和注意事项,帮助读者更好地理解和应用预处理技术。
15 2
|
1月前
|
编译器 Linux C语言
【C语言篇】编译和链接以及预处理介绍(下篇)
【C语言篇】编译和链接以及预处理介绍(下篇)
31 1
【C语言篇】编译和链接以及预处理介绍(下篇)
|
28天前
|
C语言
C语言--预处理详解(2)
【10月更文挑战第3天】
|
1月前
|
编译器 C语言
C语言预处理详解
C语言预处理详解
|
1月前
|
存储 C语言
【C语言篇】编译和链接以及预处理介绍(上篇)2
【C语言篇】编译和链接以及预处理介绍(上篇)
36 0
|
3月前
|
存储 自然语言处理 程序员
【C语言】文件的编译链接和预处理
【C语言】文件的编译链接和预处理
|
3月前
|
程序员 编译器 C语言
C语言中的预处理指令及其实际应用
C语言中的预处理指令及其实际应用
80 0