• C语言从头学43——预处理指令(二)


           本文继续学习预处理指令,并延续前文编号。
    三、预处理指令 #undef
           有时想定义一个宏,但不记得以前是否使用过,如重复定义且定义内容不同,会报错。此时可以先使用 #undef 命令取消这个宏名;即使取消一个不存在的宏名也无所谓,系统也不会报错。
           格式:#undef 宏名 
    四、预处理指令 #include
           这是一个已经使用过多次的预处理命令,作用是编译时将其它源码文件,加载进入当前文件。习惯上我们称这个命令操作为包含某头文件。
           格式1:#include <*.h> //加载系统提供的文件用尖括号
           格式2:#include "*.h" //加载自己写的文件引号
           说明:多个#include语句无顺序要求;重复包含也不会报错。
    五、预处理指令 #if…#endif
           #if … #endif指令用于预处理的条件判断,满足条件时,内部的行会被编译,否则就被编译器忽略。该语句中间还可以加上#else,形成#if ... #else ... #endif结构 (见举例程序)
    六、预处理指令 #ifdef…#endif
           #ifdef…#endif 指令用于判断某个宏是否定义过。为了避免源码文件可能重复加载某个头文件,可以在头文件里使用 #define 命令定义一个空的宏。在需要加载处通过#ifdef…#endif语句检查这个宏,判断头文件是否被加载了。如未加载,可以配合使用#else予以加载。
    七、预处理指令 #ifndef…#endif
            #ifndef…#endif指令与第六条介绍的指令正好相反。它用来判断,如果某个宏没有被定义过,则执行指定的操作。这条语句常用来防止重复加载。使用的方法同上,还是需要在头文件中加一个空宏做为标记,再用本条指令检查这个宏,如不存在,则予以加载。
    八、预定义宏 
           C语言提供一些预定义好的宏,可以直接使用,比如前边学习过的代表不定参数的宏__VA_ARGS__;其它的诸如:
           __DATE__ :编译日期,格式为“Mmm dd yyyy”的字符串(比如 Nov 23 2021)。
           __TIME__ :编译时间,格式为“hh:mm:ss”。
           __FILE__ :当前文件名。
           __LINE__ :当前行号。
           __func__ :当前正在执行的函数名。该预定义宏必须在函数作用域使用。
    九、预处理指令#line
            #line指令用于重置预定义宏 __LINE__ ,将其改为自定义的行号。后面的行自定义行号开始开始计数。
            #line 200 //将当前行的行号重置为 200
    十、预处理指令#error
           #error指令用于让预处理器抛出一个错误,终止编译。
           #if INT_MAX < 100000
           #error int type is too small
           #endif
    十一、与上述内容相关的小程序

    1. #include
    2. void test()
    3. {
    4. #define TEST 1
    5. }
    6. int main(void)
    7. {
    8. //预处理指令#undef的使用
    9. #define MAX 1000
    10. printf("MAX=%d\n", MAX);
    11. #undef MAX
    12. //printf("MAX=%d", MAX);
    13. //用#undef指令取消MAX宏后,如再使用该宏会报错
    14. //预处理指令#if...#else...#endif的使用
    15. #ifdef MAX //MAX是否定义
    16. printf("已定义的宏MAX=%d\n", MAX);
    17. #else
    18. #define MAX 10000 //如未定义重新定义
    19. printf("重新定义的MAX=%d\n", MAX);
    20. #endif
    21. //预处理指令#ifndef...#endif的使用
    22. #ifndef TEST
    23. printf("未发现函数test()...\n"); //这条语句不会执行,因为宏TEST已在test()定义
    24. #endif
    25. //显示C语言中常用预定义宏
    26. printf("%s\n", __DATE__); //运行结果:Aug 6 2024
    27. printf("%s\n", __TIME__); //运行结果:19:37:15
    28. printf("%s\n", __FILE__); //运行结果:D:\C语言从头学\C语言从头学43.c
    29. printf("%d\n", __LINE__); //运行结果:75
    30. printf("%s\n", __func__); //运行结果:main
    31. //#line的使用
    32. #line 1000
    33. printf("%d\n", __LINE__); //运行结果:1000
    34. //#error的使用
    35. #define INT_MAX 10000
    36. #if INT_MAX < 100000
    37. //#error int type is too small //不需等到编译,编程过程即报错
    38. #endif
    39. getchar();
    40. return 0;
    41. }

  • 相关阅读:
    在iPhone上恢复已删除的Safari历史记录的最佳方法
    使用IO流完成项目实战水果库存系统
    【Python 零基础入门】 函数
    想做钢铁侠?听说很多大佬都是用它入门的
    创邻科技Galaxybase分享Part1: 图数据库和主数据管理有什么关系?
    VHDL菜鸟入门到精通之激励文件编写
    高级架构师_Elasticsearch_第一章_Elasticsearch安装
    RFID仓库管理系统解决方案有哪些功能模块
    Git Gui的使用+关于SSH协议和克隆对应文件代码+IDEA集成Git等
    Java | Maven(知识点查询)
  • 原文地址:https://blog.csdn.net/m0_72128260/article/details/140964021