C语言-宏的使用

时间:2020-06-18 14:29:36   收藏:0   阅读:68

预处理指令的特点

C 程序从编写到编译,链接,执行的一个流程

预处理指令的分类

宏定义:

在使用宏的时候需要注意的地方

#include <stdio.h>
# define M 10
# define N 10+10+10
int main(int argc, const char * argv[]) {
    int num = M+10;
    printf("M = %i\n",M);
    printf("num = %i\n",num);
    
    // 宏值是整个表达式,而并不是计算的结果
    int num1 = N * 2;
    printf("num1 = %i\n",num1);
    return 0;
}

# define X a+a
int main(int argc, const char * argv[]) {
    int a = 10;
    int num2 = X;
    
    return 0;
}
# define P 3
# define A 5
# define JISUAN P*A

int main(){
    printf("JISUAN = %i\n",JISUAN);
}
# define p printf
# define d "%i"
int main(){
    p(d,10);
    return 0;
}

define 和 typedef 的区别

宏的高级用法

# define B(a) a+10+a

int main(){
    // 有参数的宏
    int num3 = B(8);
    printf("num3 = %i\n",num3);
    return 0;
}

技术分享图片

# define MAX(a,b) a > b ? a:b
int main(){
    printf("最大值是:%i\n",MAX(10, 0));
    return 0;
}

使用带参数的宏注意点

条件编译指令

# define M 10
int main(){
        // 条件编译指令
#if M == 10
    printf("我是条件编译指令的代码\n");
#endif
    return 0;
}

// 输出:我是条件编译指令的代码
    int m = 10;
#if m == 10
    printf("我是 变量 m == 10 才会执行的代码\n");
#endif
# define M 10

int main(){
    #if M > 0
    printf("M>0编译这个代码\n");
#elif M > 0 && M < 20
    printf("M > 0 && M < 20编译这个代码\n");
#elif M >20 && M < 40
    printf("M >20 && M < 40编译这个代码\n");
#else
    printf("否则编译这个代码");
#endif
    
    return 0;
}
#define M 10
int main(){
        // 第三种用法
#if M
    printf("如果定义了这个宏,就执行这个代码\n");
#endif
    return 0;
}
int main(){
        // 第三种用法
#ifndef M
    printf("如果没有定义了这个宏,就执行这个代码\n");
#endif
    return 0;
}

条件编译指令的应用场景

// 在调试的时候,调试信息有很多,又不想每次都一个一个的删除,那么可以使用条件编译指令,每次只需要修改自己定义的宏就可以对 printf 函数的控制

#include <stdio.h>


# define SHAN_DEBUG 0
# if SHAN_DEBUG == 0
    # define print(val1,val2) printf(val1,val2)
# else
    # define print(val1,val2)
# endif


int main(int argc, const char * argv[]) {

    print("%d",10);
    
    
    
    return 0;
}


// 无论一个文件包被#include 多少次,我只引入一次
#ifndef lianxi_h
#define lianxi_h

#include <stdio.h>
 // 写自己的代码
#endif /* lianxi_h */

// 原理:在 main.c中#include lianxi.h,导入很多次,#include 的作用就是将此文件全部复制过来,所以复制第一次在编译的时候如果没有导入 lianxi.h 这个文件,全部被copy 过来,此时没有定义 lianxi.h 这个宏,那么就定义这个宏 lianxi.h,然后在第二次copy 过来的时候,发现定义了这个 lianxi.h 这个宏,所以就不会重复的 copy 了

原文:https://www.cnblogs.com/shanshan-test/p/13157147.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!