C语言中的预处理
🐶博主主页:@ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++
🔥座右铭:“不要等到什么都没有了,才下定决心去做”
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
🐰 计算机语言的发展
🐰预处理
🏡预处理的详解
🌸#define定义标识符
🌸#define定义宏
🌸#define替换规则
🌸#和##
🌸#define定义宏的小问题
🌸左值与右值
🐰 计算机语言的发展
🐰预处理
1.头文件的包含
2.注释的删除
3.#define定义的符号替换
预处理指令
#define
#include
...
🏡预处理的详解
预定义符号:
__FILE__进行编译的源文件
__LINE__文件当前的行号
__DATE__文件被编译的日期
__TIME__文件被编译的时间
__STDC__如果编译器遵循ANSI C,其值为1,否则未定义(可以判断编译器是否遵循标准C)
注意:其实编译器在编译的时候,会对函数和变量名重命名的,在C语言中重命名的规则基本就是:加_
#include<stdio.h> int main() { int arr[]={1,2,3,4,5,6,7,8,9,10}; for(int i=0;i<10;i++) { //显示每个元素的存储位置 存储的日期 存储时间 printf("%d-->%s %s %s %d",arr[i],__FILE__,__DATE__,__TIME__,__LINE__); printf("\n"); } return 0; } 结果: 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 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 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 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 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 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 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 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 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 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:
#include<stdio.h> int main() { printf("%d\n",__STDC__); return 0; } 运行结果: 1 说明Xcode是遵循标准C的
🌸#define定义标识符
#define c int //就是将int 替换为c #define MAX 1000 //MAX为常量 //注意:#define 定义标识符后面不要加分号 #include<stdio.h> int main() { c a=9; printf("%d\n",MAX+a); return 0; } 结果: 1009
🌸#define定义宏
允许把参数替换到文本中,这种实现通常称为宏或定义定义宏
宏的声明方式:
#define name(parameent-list) stuff
其中的parameent-list是一个由逗号隔开的符号表,它们可能出现stuff中
注意:
参数列表的左括号必须与name紧邻,如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。(就会是#define 定义标识符)
例如:
#define定义宏 允许把参数替换到文本中,这种实现通常称为宏或定义定义宏 宏的声明方式: #define name(parameent-list) stuff 其中的parameent-list是一个由逗号隔开的符号表,它们可能出现stuff中 注意: 参数列表的左括号必须与name紧邻,如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。(就会是#define 定义标识符) 例如: #include<stdio.h> #define SQUARE(x) x*x //这个宏:计算数的平方 int main() { printf("%d\n",SQUARE(8)); //结果:64 printf("%d\n",SQUARE(1+7)); //结果:15 //宏的参数不进行任何计算替换到宏的体内。1+7*1+7 //如果想要改正确:#define SQUARE(x) ((x)*(x)) return 0; } 用宏和函数分别来求最大值 #include<stdio.h> #define MAX(a,b) (a)>(b)?(a):(b) int Max(int a,int b) { return a>b?a:b; } int main() { int m=MAX(2,3); int n=Max(2,3); printf("%d %d\n",m,n); return 0; } 结果: 3 3
🌸#define替换规则
在程序扩展#define定义符号和宏时
1.在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。
2.替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。
3.最后,再次对结果文件进行扫描,看看他是否包含任何由#define定义的符号。如果是,就重复上述过程。
注意:
1.宏参数和#define定义中可以出现其他#define定义的符号。但是对于宏,不能出现递归
2.当预处理器搜索#define定义的符号的时候,字符串常量的内容不被搜索。
🌸#和##
#的作用
#把一个宏参数变成对应的字符串(就是替换为变量名)
例如:
#include<stdio.h> #define print_format(num,format) printf("the value of " #num " is " format,num)//#num 把一个宏参数变成对应的字符串(就是替换为变量名) int main() { //这里的代码显得有点冗余,用函数无法做到精简 int a=10; printf("the value of a is %d\n",a); int b=20; printf("the value of b is %d\n",b); float c=30; printf("the value of b is %f\n",c); //使用宏来解决冗余的问题 a=40; print_format(a,"%d\n"); b=50; print_format(b, "%d\n"); c=3.14; print_format(c, "%.2lf\n"); return 0; } the value of a is 10 the value of b is 20 the value of b is 30.000000 the value of a is 40 the value of b is 50 the value of c is 3.14
##的作用
##可以把位于两边的符号合成一个符号,它允许宏定义从分离的文本片段创建标识符
注意:这样的连接必须产生一个合法的标识符,否则其结果就是为定义的
例如:
#include<stdio.h> int Class110=2023; #define CAT(x,y) x##y int main() { printf("%d\n",CAT(Class,110));//预编译的时候CAT(Class,110)替换为Class110 return 0; } 结果: 2023
🌸#define定义宏的小问题
#include<stdio.h> #define MAX(a,b) (a)>(b)?(a):(b) int Max(int a,int b) { return a>b?a:b; } int main() { int a=3; int b=5; int c=MAX(a++, b++);//调用宏 //int c=(a++)>(b++)?(a++):(b++); //(1)c=3>5?3:6 a=3 b=6 c=6 //(2)a++(前面的a++)=3+1 b++(后面的b++)=6+1 c=c=6 //(3)a=4 b=7 c=6 printf("a=%d b=%d c=%d\n",a,b,c); a=3; b=5; c=Max(a++, b++);//调用函数 printf("a=%d b=%d c=%d\n",a,b,c); return 0; } 结果: 宏:a=4 b=7 c=6 函数:a=4 b=6 c=5
🌸左值与右值
int a=10; a=20;//这里使用的是a的空间,我们说的a是右值 int c=a;//这里使用的是a中存放的数据,我们说的a是左值
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸