【c语言】详解宏定义#define 各种使用方法

创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!! 

主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

 c语言系列专栏: c语言之路重点知识整合 

#define处于预处理期过程,预处理期过程知识点:预处理详解

目录

一、宏替换格式

宏替换结尾不随意加" ; "号 !!!

 二、替换类型名称 对比typedef的差异

差异:

 三、替换一个函数或表达式

 四、嵌套宏替换

 五、用宏和typedef创建一个布尔型数据

 六、带参数的宏定义

 七、定义可计算数组长度的宏

总结 


一、宏替换格式

宏替换简称宏的格式:
        #define 宏替换名称  替换内容

#define MAX 100
int main ()
{
    int a[MAX];
    return 0;
}

 将TYPE替换成int:

#define就是查找、替换的过程

宏替换结尾不随意加" ; "号 !!!

 如果在#define语句后加分号;                  替换的就是200;      而不是200

 二、替换类型名称 对比typedef的差异

#include<stdio.h>
#define POINT_A int*
typedef int * POINT_B ;
int main ()
{
    POINT_A p1,p2;    //预处理替换后: int* p1,p2; 即p1是指针变量 p2是普通int变量
    POINT_B q1,q2;    //编译后:q1是指针变量 q2也是指针变量
    int a=10;
    p1=&a;
      p2=&a;//此处有bug

    q1=&a;
    q2=&a;
    return 0;
}

 替换!!!   POINT_A p1,p2; 也即 int* p1,p2;   p1为指针类型,p2为int类型。

差异:

1   #define执行的时点是预处理即编译前 typedef执行的时点是编译时

2   #define只是单纯的“查找替换”把源代码变成另外的样子,并没有创造新的类型名称。

3   typedef是定义的一个类型名,编译器把它当作一种新的类型来看待。所以定义类型常用typedef

 三、替换一个函数或表达式

表达式、函数也可以进行替换,在预处理期会变形成宏替换后的代码,然后进行编译

#include<stdio.h>
#define INTEGER int     //宏 代替 类型
#define PRINT printf("%d\n",a)     //宏 代替 函数
#define POINT int*     // 宏 代替 指针类型
int main ()
{
    INTEGER a =100;    //将替换成: int a =100;
    POINT p=&a;    //将替换成:int* p=&a;
    *p=888;
    PRINT;    //将替换成:printf("%d\n",a);
    return 0;
}

 四、嵌套宏替换

对宏再进行宏替换

不用循环的1000个helloworld: 

#include<stdio.h>
#define A printf("helloworld.\n");
#define B A A A A A A A A A A
#define C B B B B B B B B B B
#define D C C C C C C C C C C
int main ()
{
    D
    return 0;
}

 五、用宏和typedef创建一个布尔型数据

 boolean逻辑类型true和false   c语言中没有布尔类型,可以使用宏和typedef创建一个 布尔型

#include<stdio.h>

#define True 1         //将True全部 查找替换 成 1
#define False 0     //将False全部 查找替换 成 0

typedef int BOOLEAN;     //定义一个新类型名

int main ()
{
    BOOLEAN SUCCESS=True;    //比 int SUCCESS = 1 更具有可读性
    return 0;
}

 还可以定义sex男女类型等,增强代码的可读性。

六、带参数的宏定义

内容模板:可变内容 不变内容

变化的地方用(a,b)代替

#include<stdio.h>
#define ADD(a,b) a + b
int main()
{
    printf("%d\n",ADD(3,5) );        //替换成:printf("%d\n",3+5 )
    printf("%d\n",ADD(1+2,3+5) );    //替换成:printf("%d\n",1+2+3+5 )
}

七、定义可计算数组长度的宏

 变化的地方( 数组名 )用arr_name代替

#include<stdio.h>
#define LENGTH(arr_name) sizeof(arr_name)/sizeof(arr_name[0])
int main()
{
    int arr[]={1,2,3,4,5};
    float arr1[]={1.1,2.2,3.3};

    printf("%.1f\n",LENGTH(arr1) );  //被替换成:sizeof(arr1)/sizeof(arr1[0])

    int i;
    for(i=0;i<LENGTH(arr) ;i++)    //被替换成:for(i=0;i<sizeof(arr)/sizeof(arr[0]) ;i++)
    {
        printf("%d\n",arr[i]);
    }
}

注: #define LENGTH(arr_name) sizeof(arr_name)/sizeof(arr_name[0])

LENGTH(arr_name)中间没有空格!!!一个整体为宏,否则被替换成(arr_name)

定义有参数的宏时,可变部位()紧挨宏名

总结 

宏的本质是:查找、替换!

宏的作用是:增强可读性、灵活性!

 大家的点赞、收藏、关注将是我更新的最大动力!欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值