设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间20 现在时间20 缓存数据 和聪明人交流,和靠谱的人恋爱,和进取的人共事,和幽默的人随行。晚安!

和聪明人交流,和靠谱的人恋爱,和进取的人共事,和幽默的人随行。晚安!

查看: 255|回复: 1

C语言中#define定义的标识符和宏实例代码

[复制链接]

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:23
  • 打卡月天数:0
  • 打卡总奖励:316
  • 最近打卡:2025-11-27 18:42:56
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
417
主题
385
精华
0
金钱
1538
积分
848
注册时间
2023-2-10
最后登录
2025-11-27

发表于 2023-2-13 13:04:17 | 显示全部楼层 |阅读模式
📢1.#define定义标识符

在C语言程序中,有时候会包含#define
#define可以定义标识符
也就是说可以对字符重新定义,实现代替的作用

📢语法
  1. #define  name  stuff 
  2. 就比如说:
  3. #define MAX 1000(用MAX代替1000)
  4. #define reg   register (用reg代替register)
复制代码
📢举个栗子
  1. #include<stdio.h>
  2. #define MAX 100
  3. int main()
  4. {
  5.         printf("%d", MAX);
  6.         return 0;
  7. }
复制代码
  1. 当代码运行的时候
  2. 在代码编译的预处理阶段 就会把宏替换为文本程序代码
  3. 代替的结果如下:
复制代码
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         printf("%d", 100);
  5.         return 0;
  6. }
复制代码
📢注意:#define定义标识符后面尽量不加上分号,因为如果加上的话,在替换的过程中,分号也会别替换到文本程序中,有时候会导致出现逻辑错误。

📢2.#define定义宏

#define规定允许将参数替换到文本中,这样包含参数叫做#define定义宏
宏在程序中,执行的速度更快,因为相对于函数,宏没有函数的调用和返回的开销
  1. 语法:#define SQUARE(x)   x*x
复制代码
这与#define定义宏一样,都是完成替换的,不过#define定义宏后面有一个括号,包含参数
📢下面用#define定义宏来实现两个数求最大值
  1. #include<stdio.h>
  2. #define MAX(x,y) ((x)>(y)?(x):(y))
  3. int main()
  4. {
  5.         int a = 20;
  6.         int b = 10;
  7.         int c = MAX(a,b);
  8.         printf("%d", c);
  9.         return 0;
  10. }
复制代码
替换后的结果为:
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int a = 20;
  5.         int b = 10;
  6.         int c = a>b?a:b;
  7.         printf("%d", c);
  8.         return 0;
  9. }
复制代码
  1.  在#define定义宏的时候,后面的参数尽量带上括号,使每一个参数相对独立
  2. 这样可以避免由于操作符的优先级不同,导致最终的逻辑就错了
复制代码
举个栗子:
  1. #include<stdio.h>
  2. #define sum(x) x*x
  3. int main()
  4. {
  5.         int ret = sum(3 + 3);
  6.         printf("%d", ret);
  7. }
复制代码
140425nv9sv74su7cllh0r.png

如果不仔细观察的话,可能你认为的结果就是36
这个代码的计算过程为:3+3*3+3,并不是(3+3)*(3+3)

📢#define替换的规则
  1. #define定义标识符和宏时,程序会继续如下步骤
  2. 1.在定义宏时,先对参数进行检查,如果参数里包含有#define定义的标识符时,首先完成相应的替换
  3.  
  4. 2.替换文本会随后插入到原来文本文件中,对于宏来说,参数名被他们的值所替换
  5.  
  6. 3.最后进行检查,果然还有#define定义的符号,将重复上述的操作
复制代码
注意:
1.#define参数中可以包含其他由#define定义的标识符,但是#define不能递归
2.如果#define的参数名存在在字符串中,将不会完成替换

📢#与## #的用法:

在不确定参数的情况下,可以使用“#n” ,可以实现不同字符串的插入
效果如下:
  1. #include<stdio.h>
  2. #define PRINT(n) printf("the value of "#n" is %d\n",n);
  3. int main()
  4. {
  5.         int a = 10;
  6.         PRINT(a);
  7.         int b = 20;
  8.         PRINT(b);
  9.     int c= 30;
  10.     PRINT(c);
  11.         return 0;
  12. }
复制代码
📢替换后的效果为:
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int a = 10;
  5.     printf("the value of" "a" " is %d\n",a);
  6.         PRINT(a);
  7.         int b = 20;
  8.         PRINT(b);
  9.     printf("the value of " "b" " is %d\n",b);
  10.     int c= 30;
  11.     PRINT(c);
  12.     printf("the value of " "c" " is %d\n",c);
  13.         return 0;
  14. }
复制代码
140425i87mxuhcleuhhh9m.png

##的用法:
  1. #include<stdio.h>
  2. #define CAT(Max,num) Max##nu
  3. int main()
  4. {
  5.         int Maxnum = 100;
  6.         printf("%d", Maxnum);
  7.         return 0;
  8. }
复制代码
140425asv4pvpbjp4m6mp7.png

双##的用法可以拼接两个字符串
当然这个前提是拼接后的字符串必须产生一个合法的标识符,否则结果就是未定义的

📢宏的缺点
  1.  1.如果使用宏过多,宏定义的代码插入到程序中,会大幅度增加程序的长度
  2. 2.宏是没法调试的
  3. 3.宏与类型无关,导致程序不够严谨
  4. 4.宏会带来优先级的问题,容易导致程序的错误
复制代码
📢宏和函数的优缺点      

1).在代码长度角度上,因为宏是直接替换所以若宏较长会增加代码长度
2).在执行速度上,宏较函数快,因为函数存在调用/返回时的额外开销
3).在参数求值方面,define定义的宏可能会具有副作用会导致修改变量最后的值,而函数即使调用多次也不会修改变量原来的值
4).在参数类型方面,宏与类型无关,所以宏是可以传参数的而函数不行在C中函数是不可以传类型的
5).在是否可调试方面,宏不可调试,函数可调试宏可以传类型的检测,实现malloc(动态开辟内存的函数)
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MALLOC(COUNT,TYPE)\
  4.     (TYPE *)alloc(COUNT*sizeof(TYPE))
  5. void *alloc(int sz)   //宏可以传类型,函数不可以传类型
  6. {
  7.     void *p=malloc(sz);
  8.     if(p == NULL)
  9.     {
  10.         printf("out of memory\n");
  11.         exit(EXIT_FAILURE);
  12.     }
  13.     return p;
  14. }
  15. int main()
  16. {
  17.     int i=0;
  18.     int *p=MALLOC(10,int);
  19.     for(i=0;i<10;i++)
  20.     {
  21.         *(p+i)=i;
  22.     }
  23.     for(i=0;i<10;i++)
  24.     {
  25.         printf("%d ",*(p+i));
  26.     }
  27.     free(p);
  28.     system("pause");
  29.     return 0;
  30. }
复制代码
总结

到此这篇关于C语言中#define定义的标识符和宏的文章就介绍到这了,更多相关C语言#define定义标识符和宏内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-27
最后登录
2022-12-27

发表于 7 天前 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表