• 预处理


    2.1文件的包含

    为了使编写的程序结构优良,更易于调试和阅读,需要灵活使用预处理。

    #include""

    #include<>

    2.2宏定义

    宏替换:在预处理阶段用预先定义的字符串代替标示符的过程

    #define 标示符  字符串

    标识符都大写

    注意:

    1宏替换不做语法检查,

    2宏替换通常在文件开头部分,用#undef命令终止宏定义的作用域。

    3不要在字符串中使用宏。

    4该加()的时候加();

    2.2.2带参数的宏替换

    #define  宏名(参数表) 字符串

    注意:

    1、宏名和参数表之间不能有空格;

    2、宏替换只做替换;

    3、函数调用在编译后程序运行时进行,分配内存,宏替换在编译前进行,不分配内存;

    4、宏的哑实结合类似于函数调用过程中实参代替形参的过程,不存在类型,也没有类型转换;

    5、宏展开使源程序边长,而函数调用则不会。

    2.2.3嵌套宏替换

    在一个宏定义中使用另外一个宏

    #define    N   3

    #define    N_CUBE  N*N*N

    #define    CUBE_ABS  ((N_CUBE >0)?(N_CUBE : -1*(N_CUBE))

    嵌套宏替换在预处理阶段进行扩展的时候是逐层进行的,以上面的CUBE_ABS为例,在已处理阶段将对其中的每个宏名进行扩展,直到没有宏名为止。

    2.3宏定义常见的错误分析

    #define  INT_P  int *

    结果在声明 的时候

    INT_P  p , p1;

    这时候P1并没有定义成我们想要的整形指针,而是一个整形变量。

    -----------------------

    #define N 10

    Printf(“N的值为%d”,N);

    报错,因为扩展后 为Printf(“N的值为%d”,N;);  多了一个; 分号

    -----------------------

    不要在字符串中用宏,否则会被编译器按照字符串来处理!

    2.3.2带参数的宏

    #define SUM(x,y) x+y
    void main()
    {
    int x=6;
    int y=9;
    int s=SUM(x,y);
    printf("x+y的值:%d",s);
    return;
    }
    输出结果:
    printf("x+y的值:15
    将代码:int s=SUM(x,y);修改为int s=SUM(x,y)*10;
    输出结果:
    printf("x+y的值:96
    为什么出错,本应该150的
    因为扩展后为int  s=x+y*10;
    将宏定义该一下:#define SUM(x,y) (x+y)
    这样就对了。
    

      

  • 相关阅读:
    【转载】Spring各jar包详解
    Docker attach卡着的解决
    三张图搞透第一范式(1NF)、第二范式(2NF)和第三范式(3NF)的区别
    决策表
    因果图与决策表法
    边界值分析法
    黑盒测试方法
    软件测试的基本流程
    软件测试原则
    软件测试与软件开发
  • 原文地址:https://www.cnblogs.com/heri/p/2863634.html
Copyright © 2020-2023  润新知