• 【C语言】预处理超级详细解析


    前言:

    作者简介:爱吃大白菜1132

    人生格言:纸上得来终觉浅,绝知此事要躬行

     

    如果文章知识点有错误的地方不吝赐教,和大家一起学习,一起进步!

     

    如果觉得博主文章还不错的话,希望三连支持!

    目录

     

    1.预处理符号

    2.#define

    #define 定义标识符 

    #define 定义宏

    #define 替换规则 

    3.宏定义中的#和##号的区别 

    #的作用

    ##的作用

    4.条件编译


    1.预处理符号

    1. __FILE__ //进行编译的源文件
    2. __LINE__ //文件当前的行号
    3. __DATE__ //文件被编译的日期
    4. __TIME__ //文件被编译的时间
    5. __STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义

    以上预定义符号都是C语言内置的。

    2.#define

    #define 定义标识符 

    1. 语法:
    2. #define name stuff

    例如:

    1. #include
    2. #define MAX 10
    3. int main()
    4. {
    5. printf("%d\n", MAX);//打印10
    6. return 0;
    7. }

    #define 定义宏

    1. 语法:
    2. #define name( parament-list ) stuff

    注:

             参数列表的左括号必须与name紧邻。

             如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。

    1. #include
    2. #define SUM(a,b) (a)+(b)
    3. int main()
    4. {
    5. printf("%d\n", SUM(2, 3));
    6. return 0;
    7. }

     注:

            由于宏是通过替换完成的,所以操作符的优先级会影响宏的求值,应该尽量使用括号明确优先级。

    #define 替换规则 

    在程序中扩展#define定义符号和宏时,需要涉及几个步骤。

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

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

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

    3.宏定义中的#和##号的区别 

    #的作用

            加上#后进入宏定义,在预处理时,不会将其改变成参数,而是保留参数所对应的字符串。

    1. #include <stdio.h>
    2. #define PRINT( VALUE,FORMAT) printf("the value of "#VALUE" is " FORMAT "\n", VALUE);
    3. int main()
    4. {
    5. int a = 3;
    6. PRINT(a,"%d");
    7. //预处理会替换为:
    8. //printf("the value of a is %d\n", a);
    9. }

    ##的作用

    ##可以把位于它两边的符号合成一个符号。

    它允许宏定义从分离的文本片段创建标识符。

    1. //FUC将c和h粘合到一起,相当于字符名ch
    2. #include
    3. #define FUC(A,B) A##B
    4. int main()
    5. {
    6. char ch[] = "hello world";
    7. printf("%s\n", FUC(c,h) );
    8. }

    4.条件编译

    常见的条件编译指令:

    1. 1.
    2. #if 常量表达式
    3. //...
    4. #endif
    5. //常量表达式由预处理器求值。
    6. 如:
    7. #define __DEBUG__ 1
    8. #if __DEBUG__
    9. //..
    10. #endif
    11. 2.多个分支的条件编译
    12. #if 常量表达式
    13. //...
    14. #elif 常量表达式
    15. //...
    16. #else
    17. //...
    18. #endif
    19. 3.判断是否被定义
    20. #if defined(symbol)
    21. #ifdef symbol
    22. #if !defined(symbol)
    23. #ifndef symbol
    24. 4.嵌套指令
    25. #if defined(OS_UNIX)
    26. #ifdef OPTION1
    27. unix_version_option1();
    28. #endif
    29. #ifdef OPTION2
    30. unix_version_option2();
    31. #endif
    32. #elif defined(OS_MSDOS)
    33. #ifdef OPTION2
    34. msdos_version_option2();
    35. #endif
    36. #endif

    小节:

    一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者。 那我们平时的一个习惯是:

    把宏名全部大写

    函数名不要全部大写 

  • 相关阅读:
    ZYNQ7010的PS编程笔记
    4.zigbee开发,串口的应用,ADC采集
    java springboot在测试类中构建虚拟MVC环境并发送请求
    Linux内存管理(三十二):直接内存规整详解
    GeoAO:一种快速的环境光遮蔽方案
    文心一言 VS 讯飞星火 VS chatgpt (203)-- 算法导论15.3 2题
    路由守卫
    数组排序(O(n的二次方))
    前端使用 Konva 实现可视化设计器(8)- 预览框
    信息系统项目管理师(第四版)教材精读思维导图-第十三章项目资源管理
  • 原文地址:https://blog.csdn.net/qq_65228171/article/details/127464938