-seventy-
Welcome to my blog space.

预处理

/*
    ---用 # 号开头的命令是预处理命令
    ---“预处理”即:预先处理,在编译前对代码进行一个预先处理
    
    include <文件.h>    // 这个是文件包含命令

    总上所述, # include <stdio.h>    即是:执行“预处理文件包含stdio.h”
*/

#  include

/*
    当 main.c 这个主文件越写越大的时候
    我们可以将它其中的某些部分,通过写到其他文件的方式
    来达到将代码有条理地进行布局分离的目的
    从而实现高效维护和管理的目标
    如同所示:
*/

 # define

/*
    1. # define 宏定义命令:使用一个表示符“表示”(或者说“完全替代”)一个字符串
    2. 语法:
        # define    宏名    字符串
*/

# include <stdio.h>

# define unint    unsigned int    // 宏名的规范写法为“全大写”,即 UNINT。
# define PI        3.14f
# define NAME    "tomato"
# define A        num * 2 + 1
# define B        (num * 2 + 1)

int main()
{    
    unint num = 1;
    printf("圆周率%f \n", PI);
    printf("我的名字%s \n", NAME);
    printf("结果%d \n", 3 * A);        // 结果:7
    printf("结果%d \n", 3 * B);        // 结果:9
    //printf("", );
    return 0;
}
# include <stdio.h>

# define M(x)        x*x+3*x
# define P(a,b)        a + b

int main()
{    
    int res = M(2);
    printf("结果为 %d \n", res);

    res = M(6);
    printf("结果为 %d \n", res);

    res = M(3 + 3);
    printf("结果为 %d \n", res);

    res = M(2 * 3);
    printf("结果为 %d \n", res);

    res = P(1, 2);
    printf("%d \n", res);

    return 0;
}

/*
    运行结果——————

        结果为 10
        结果为 54
        结果为 27
        结果为 54
        3
        请按任意键继续. . .
*/
# include <stdio.h>

# define    N(a,b)    a = a ^ b; b = a ^ b; a = a ^ b;    // ^ 异或,详情见底部
// 当一行内容过多的时候,可以用"\"符号实现“视觉上发生换行但代码本质还是一行”


int main()
{    
    int n = 9, m = 8;
    printf("%d %d \n", n, m);
    N(n, m);
    printf("%d %d \n", n, m);

    return 0;
}

/*
    运行结果——————

        9 8
        8 9
        请按任意键继续. . .
*/

/*
    上面的异或原理:(author:小六子,from:知乎)

        打个比方a=11011,b=10101a和b做异或得到 01110
        将他赋值给a,则a=01110(a=a^b,a承载着a和b的不同),接着将a(01110)和b(10101)做异或得 11011
        发现就是原来a的值
        于是将它赋值给b,b=11011,则b现在就是a原来的值了(b=a^b),再将a(01110)和b(11011)异或得10101
        发现就是原来b的值,将它赋值给a,a=10101,则a现在就是b原来的值(a=a^b)
        这样就实现了互换a和b的值
*/
# include <stdio.h>

# define    STR(s)    #s
# define    NUM1(a,b)    a##e##b        // 连接成aeb
# define    NUM2(a,b)    a##b##99    // 连接成ab99


int main()
{    
    printf("%s \n", "abc123");
    printf("%s \n", STR("abc123"));
    printf("%s \n", STR(abc123));

    printf("%f \n", NUM1(1.23, 3));        // 连接成aeb,即 1.23e3 => 1.23 * 1000
    printf("%d \n", NUM2(12, 5));        // 连接成ab99,即 12599

    return 0;
}

/*
    运行结果——————

        abc123
        "abc123"
        abc123
        1230.000000
        12599
        请按任意键继续. . .
*/


/*
    上面的异或原理:(author:小六子,from:知乎)

        打个比方a=11011,b=10101a和b做异或得到 01110
        将他赋值给a,则a=01110(a=a^b,a承载着a和b的不同),接着将a(01110)和b(10101)做异或得 11011
        发现就是原来a的值
        于是将它赋值给b,b=11011,则b现在就是a原来的值了(b=a^b),再将a(01110)和b(11011)异或得10101
        发现就是原来b的值,将它赋值给a,a=10101,则a现在就是b原来的值(a=a^b)
        这样就实现了互换a和b的值
*/

条件编译

# include <stdio.h>
/*
    条件编译(多种类型)
    1.    #if ... #endif        (可以穿插 #elif、#else)
    2.    #ifdef ... #endif    (可以穿插 #else)    
    3.    #ifndef ... #endif    (可以穿插 #else)
*/

# define NAME    // 对 NAME 进行宏定义,定义完成后,NAME就是宏名

int main()
{    
# if 1 - 1
    printf("My name is %s.\n", "tomato");
# elif 0
    printf("My name is %s.\n", "banana");
# else
    printf("My name is %s.\n", "apple");
# endif


# ifdef NAME        // 判断 NAME 是否为宏名,即是否进行了宏定义
    printf("111 \n");
# endif


# ifndef NAME        // if-not-def
    printf("222 \n");
# endif


    return 0;
}
/*
    使用场景:
        我们在 main.c 文件中编写代码时,
        有可能因为精神疲劳,而不小心造成错误
        例如:
        不小心引入了多次头文件<xxx.h>而导致出现“重定义”的情况
        我们如何解决这个问题?(下面有两个解决方案)
        方案1-----删除多余“引入头文件”的代码
        方案2-----我们能否在头文件上面做些手脚?使得它不论引入多少次,都只会执行一次。
*/



// 下面是头文件里面的代码
// 我们通过“条件编译”的知识来实现“方案2”

#ifndef MYFILE_H    // 判断:MYFILE_H 没有被定义?(ifndef => if-not-def)
#define MYFILE_H
struct Mystruct
{
    int num;
};
#endif                // 如果 #ifndef 的判断结果为‘错’,将跳到这行,直接结束

 

posted on 2023-07-13 18:33  -seventy-  阅读(29)  评论(0)    收藏  举报