找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 21|回复: 0

#define MAX(a, b)   a>b?a:b 的那些坑

[复制链接]

47

主题

34

回帖

4万

积分

管理员

积分
42145
发表于 2025-3-31 18:36:04 | 显示全部楼层 |阅读模式
很多程序员不知道C中的“宏”到底是什么意思?非凡是当宏有参数的时候,经常把宏和函数混淆。我想在这里我还是先讲讲“宏”,宏只是一种定义,他定义了一个语句块,当程序编译时,编译器首先要执行一个“替换”源程序的动作,把宏引用的地方替换成宏定义的语句块,就像文本文件替换一样。这个动作术语叫“宏的展开”
使用宏是比较“危险”的,因为你不知道宏展开后会是什么一个样子。例如下面这个宏:
  #define MAX(a, b)   a>b?a:b
当我们这样使用宏时,没有什么问题: MAX( num1, num2 ); 因为宏展开后变成 num1>num2?num1:num2;。但是,假如是这样调用的,MAX( 17+32, 25+21 ); 呢,编译时出现错误,原因是,宏展开后变成:17+32>25+21?17+32:25+21,哇,这是什么啊?
所以,宏在使用时,参数一定要加上括号,上述的那个例子改成如下所示就能解决问题了。
  #define MAX( (a), (b) )   (a)>(b)?(a)b)
  
即使是这样,也不这个宏也还是有Bug,因为假如我这样调用 MAX(i++, j++); ,经过这个宏以后,i和j都被累加了两次,这绝不是我们想要的。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/qq_44681788/article/details/122927720
我知道答案 回答被采纳将会获得 10 金钱 已有0人回答
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|flightreview|小黑屋|PX4-Autopilot|PX4论坛

GMT+8, 2025-5-10 04:28 , Processed in 0.062313 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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