博客主页:https://blog.csdn.net/weixin_46094737?type=blog
欢迎评论⭐留言 如有错误敬请指正!
本文由小学生廉原创,首发于 CSDN🙉🙉🙉
未来很长,值得我们全力奔赴更美好的生活!💞💞💞
C语言的预处理器在源代码编译之前对其进行一些文本性质的操作。它的主要任务包括删除注释、插入被#include指令包含的文件内容、定义和替换由#define指令定义的符号,同时确定代码的部分内容是否应该根据一些条件编译指令进行编译。
一、预定义符号
下表为C语言预处理器定义的符号。他们的值有的是字符串常量,有的是十进制数字常量。
| 符号 | 示例值(注意%s、%d) | 含义 |
| __ FILE__ | D:\lianpan\code\0815\预处理(宏)1.c | 编译文件当前所在的路径 |
| __ LINE__ | 16 | 当前代码所在行号 |
| __ DATE__ | Aug 15 2022 | 当前代码编译日期 |
| __ TIME__ | 23:04:26 | 当前代码编译时间 |
#define name(parameter-list) stuff
其中,parameter-list(参数列表)是一个由逗号分隔的符号列表,它们可能出现在stuff 中。参数列表的左括号必须与name紧邻。否则,参数列表就会被解释为stuf的一部分。
当宏被调用时,名字后面是一个由逗号分隔的值的列表,每个值都与宏定义中的一个参数相对应。当参数出现在程序中时,与每个参数对应的实际值都将会被替换到stuff中。
#define A 110
这里需要指明的是,我们这里定义A,在后面引用A或者说用A在参与运算是,A的值都是以文本的形式进行编译,只是当我们运算时,编译系统自动帮我们识别了。
- #include
- #define A 110
- int main()
- {
- printf("%d",A+100);
-
- return 0;
- }
运算结果:210
源代码:
- #include
- #define NUM 100.0
- #define DEBUG
- #define A 110
- int main()
- {
- int a;
- printf("%f\n",NUM+100);
- #ifdef A
- printf("%d",A);
- #endif
-
- #ifdef DEBUG
- scanf("%d",&a);
- printf("%d\n",a);
- printf("当前行号:%d\n",__LINE__);
- printf("当前文件路径:%s\n",__FILE__);
- printf("当前编译日期:%s\n",__DATE__);
- printf("当前编译时间:%s",__TIME__);
-
- #endif
-
- return 0;
- }
运行结果:

宏非常频繁的用于执行简单的计算,比如在两个表达式中寻找其中较大的一个(或较小):
- #define MINNUM2(A,B) printf("最小值为:%d\n",A>B ? B:A)
- #define PRINT(CH) puts(CH)
- #define PRINT_ARR(ARR,N) for(int i=0;i
- { \
- printf("%d ",ARR[i]);\
- }
这个功能好像我们也能用函数来实现,那为什么不使用函数呢?有两个原因。首先,用于调用和从函数返回的代码很可能比实际执行这个小型工作的代码更大,所以使用宏要比使用函数在程序中的规模和速度都更胜一筹。
其次,更为重要的是,函数的参数必须声明为一种特定的类型,所以它只能在类型合适的表达式中使用。但是宏是与类型无关的。
有优点就会有缺点,和使用函数相比,使用宏的不利之处在于每次使用宏时,一份宏定义代码的副本都将会插入到程序中。除非宏非常短,否则使用宏可能会大幅度增加程序的长度。
源代码:
- #include
- #define MINNUM2(A,B) printf("最小值为:%d\n",A>B ? B:A)
- #define PRINT(CH) puts(CH)
- #define PRINT_ARR(ARR,N) for(int i=0;i
- { \
- printf("%d ",ARR[i]);\
- }
- int main()
- {
- int a,b;
- printf("请输入两个整数:\n");
- scanf("%d %d",&a,&b);
- MINNUM2(a,b);
-
- char ch[10]="123456";
- PRINT(ch);
-
- int arr[5]={1,2,3,4,5};
- PRINT_ARR(arr,5);
-
- {
- FILE *fp;
- fp = fopen("__TIME__.txt","a");//打开文件方式为写入
- fprintf(fp,"当前调试时间为:%s\n",__TIME__);//将写入的结果打印到指定的文件中进行输出
- fclose(fp);//关闭文件
- }
-
- return 0;
- }
运行结果:
