• c语言预处理及宏函数知识点总结


    博客主页:https://blog.csdn.net/weixin_46094737?type=blog
    欢迎评论⭐留言  如有错误敬请指正!
    本文由小学生廉原创,首发于 CSDN🙉🙉🙉
    未来很长,值得我们全力奔赴更美好的生活!💞💞💞

    1、预处理定义:

    C语言的预处理器在源代码编译之前对其进行一些文本性质的操作。它的主要任务包括删除注释、插入被#include指令包含的文件内容、定义和替换由#define指令定义的符号,同时确定代码的部分内容是否应该根据一些条件编译指令进行编译。

    一、预定义符号
    下表为C语言预处理器定义的符号。他们的值有的是字符串常量,有的是十进制数字常量。

    符号示例值(注意%s、%d)含义
    __ FILE__ D:\lianpan\code\0815\预处理(宏)1.c编译文件当前所在的路径
    __ LINE__ 16当前代码所在行号
    __ DATE__ Aug 15 2022当前代码编译日期
    __ TIME__23:04:26当前代码编译时间

    2、宏
    #define机制包括一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或者定义宏(define macro)。下面是宏的声明方式:

    #define name(parameter-list) stuff

    其中,parameter-list(参数列表)是一个由逗号分隔的符号列表,它们可能出现在stuff 中。参数列表的左括号必须与name紧邻。否则,参数列表就会被解释为stuf的一部分。

    当宏被调用时,名字后面是一个由逗号分隔的值的列表,每个值都与宏定义中的一个参数相对应。当参数出现在程序中时,与每个参数对应的实际值都将会被替换到stuff中。
     

    #define A 110

    这里需要指明的是,我们这里定义A,在后面引用A或者说用A在参与运算是,A的值都是以文本的形式进行编译,只是当我们运算时,编译系统自动帮我们识别了。

    1. #include
    2. #define A 110
    3. int main()
    4. {
    5. printf("%d",A+100);
    6. return 0;
    7. }

    运算结果:210 

    源代码:

    1. #include
    2. #define NUM 100.0
    3. #define DEBUG
    4. #define A 110
    5. int main()
    6. {
    7. int a;
    8. printf("%f\n",NUM+100);
    9. #ifdef A
    10. printf("%d",A);
    11. #endif
    12. #ifdef DEBUG
    13. scanf("%d",&a);
    14. printf("%d\n",a);
    15. printf("当前行号:%d\n",__LINE__);
    16. printf("当前文件路径:%s\n",__FILE__);
    17. printf("当前编译日期:%s\n",__DATE__);
    18. printf("当前编译时间:%s",__TIME__);
    19. #endif
    20. return 0;
    21. }

    运行结果:

    3、宏函数

    宏非常频繁的用于执行简单的计算,比如在两个表达式中寻找其中较大的一个(或较小):

    1. #define MINNUM2(A,B) printf("最小值为:%d\n",A>B ? B:A)
    2. #define PRINT(CH) puts(CH)
    3. #define PRINT_ARR(ARR,N) for(int i=0;i
    4. { \
    5. printf("%d ",ARR[i]);\
    6. }

    这个功能好像我们也能用函数来实现,那为什么不使用函数呢?有两个原因。首先,用于调用和从函数返回的代码很可能比实际执行这个小型工作的代码更大,所以使用宏要比使用函数在程序中的规模和速度都更胜一筹。

    其次,更为重要的是,函数的参数必须声明为一种特定的类型,所以它只能在类型合适的表达式中使用。但是宏是与类型无关的

    有优点就会有缺点,和使用函数相比,使用宏的不利之处在于每次使用宏时,一份宏定义代码的副本都将会插入到程序中。除非宏非常短,否则使用宏可能会大幅度增加程序的长度。

    源代码:

    1. #include
    2. #define MINNUM2(A,B) printf("最小值为:%d\n",A>B ? B:A)
    3. #define PRINT(CH) puts(CH)
    4. #define PRINT_ARR(ARR,N) for(int i=0;i
    5. { \
    6. printf("%d ",ARR[i]);\
    7. }
    8. int main()
    9. {
    10. int a,b;
    11. printf("请输入两个整数:\n");
    12. scanf("%d %d",&a,&b);
    13. MINNUM2(a,b);
    14. char ch[10]="123456";
    15. PRINT(ch);
    16. int arr[5]={1,2,3,4,5};
    17. PRINT_ARR(arr,5);
    18. {
    19. FILE *fp;
    20. fp = fopen("__TIME__.txt","a");//打开文件方式为写入
    21. fprintf(fp,"当前调试时间为:%s\n",__TIME__);//将写入的结果打印到指定的文件中进行输出
    22. fclose(fp);//关闭文件
    23. }
    24. return 0;
    25. }

     运行结果:

  • 相关阅读:
    【APP VTable】和市面上的 Table 组件一样,都是接收表格[] 以及数据源[]
    java获取字符串集合中每个字符并且组成一个新的集合实现
    SpringCloud之@FeignClient()注解的使用方式
    抢单业务介绍
    go 结构体
    OpenHarmony 3.1 Beta版本关键特性解析——分布式DeviceProfile
    使用可接受gitlab参数的插件配置webhook
    AcWing245. 你能回答这些问题吗 线段树详解
    Matplotlib绘图添加标题,图例,网格,参考线,注释文本,数学表达式,标签,修改刻度
    新设备的idea编辑器导入旧设备的配置
  • 原文地址:https://blog.csdn.net/weixin_46094737/article/details/126356497