0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何才能避免【宏】的这七个误区

电子设计 来源:电子设计 作者:电子设计 2020-12-24 14:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

语法错误

当使用参数调用宏时,会将参数替换为宏主体,并与其他输入文件一起检查结果,以进行更多的宏调用,可以将部分来自宏主体和部分自变量的宏调用组合在一起。例如,

#define twice(x) (2*(x))

#define call_with_1(x) x(1)

call_with_1 (twice)

//x=1

→ twice(1)

→ (2*(1))

宏定义不必带有括号,通过在宏主体中编写不平衡的开放括号,可以创建一个从宏主体内部开始但在宏主体外部结束的宏调用。例如,

#define strange(file) fprintf (file, "%s %d",

strange(stderr) p, 35)
→ fprintf (stderr, "%s %d", p, 35)

组合宏调用的功能可能会很有用,但是在宏主体中使用不平衡的开放括号只会造成混淆,应该避免。

运算符优先级问题

在大多数宏定义示例中,每次出现的宏参数名称都带有括号,并且另一对括号通常会包围整个宏定义,这是编写宏最好的方式。举个例子

#define ceil_div(x, y) (x + y - 1) / y

假定其用法如下:

a = ceil_div(b&c,sizeof(int));

拓展开是

a =(b&c + sizeof(int)-1)/ sizeof(int);

这没有达到我们的预期,C的运算符优先级规则使其等效于此,而我们想要的是:

a =(((b&c)+ sizeof(int)-1))/ sizeof(int);

如果我们将宏定义为

#define ceil_div(x,y)((x)+(y)-1)/(y)

可能导致另一种情况,sizeof ceil_div(1,2)是一个C表达式,可以计算ceil_div(1,2)类型的大小,它扩展为:

sizeof((1)+(2)-1)/(2)

这将采用整数的大小并将其除以2,而除法包含在内部的sizeof之外。所以整个宏定义的括号可防止此类问题。那么,下面是定义ceil_div的正确方法如下

#define ceil_div(x,y)((((x)+(y)-1)/(y))

吞噬分号

通常需要定义一个扩展为复合语句的宏。例如,考虑以下宏,该宏跨空格字符前进一个指针(参数p表示在何处查找):

#define SKIP_SPACES(p, limit)

{ char *lim = (limit);

while (p < lim) {

if (*p++ != ' ') {

p--; break; }}}

该宏定义必须是单个逻辑行,严格来说,该调用扩展为复合语句,这是一个完整的语句,不需要用分号结束。

但是,由于它看起来像函数调用,因此,如果可以像使用函数调用一样使用它,则可以最大程度地减少混乱,然后再写一个分号,就像在SKIP_SPACES(p,lim)中一样。

这可能会在else语句之前出问题,因为分号实际上是空语句。假设你写

if (*p != 0)

SKIP_SPACES (p, lim);

else …

在if条件和else条件之间存在两个语句(复合语句和null语句)使C代码无效。

怎么解决?我们可以使用do…while语句更改宏SKIP_SPACES的定义以解决此问题。方法如下:

#define SKIP_SPACES(p, limit)

do { char *lim = (limit);

while (p < lim) {

if (*p++ != ' ') {

p--; break; }}}

while (0)

SKIP_SPACES (p, lim);扩展为

do {…} while (0);

这是一个陈述,循环仅执行一次,而且大多数编译器不会为此生成任何额外的代码。

审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4423

    浏览量

    68058
  • 代码
    +关注

    关注

    30

    文章

    4983

    浏览量

    74553
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    做单片机开发,新手最容易犯的 3 选型误区

    很多做硬件和软件开发的新手,一开始选型很容易走弯路,浪费打样成本和时间。 分享三最常见的误区: 一味追求高配置,功能用不上,反而增加成本。 不看实际功耗需求,做电池产品选错系列,续航拉胯。 只看
    发表于 05-20 14:48

    光模块频繁故障?避开3使用误区就够了

    。 避开3误区,做好规范操作和日常防护,就能降低光模块故障率,节省维修更换成本。若有选型、养护疑问,欢迎评论区留言交流。
    发表于 04-28 17:37

    UPS不间断电源选购功率,等于主机电源功率吗?一常见的配置误区解析

    ,却在设备开机瞬间或高负载运行时,频频触发UPS的过载警报,甚至导致意外断电。揭示了一广泛存在的认知误区:UPS的选购功率,是否应该简单地等同于设备电源的额定功
    的头像 发表于 04-22 14:00 152次阅读
    UPS不间断电源选购功率,等于主机电源功率吗?一<b class='flag-5'>个</b>常见的配置<b class='flag-5'>误区</b>解析

    磁环电感选型:避开那些常见误区

    在电子产品的研发过程中,磁环电感虽小,选型不当却可能引发设备发热、啸叫甚至无法正常工作。很多工程师在选型时,往往只关注电感量这一参数,其实是一常见误区。本文为您梳理磁环电感选型中
    的头像 发表于 04-22 13:06 172次阅读

    设备状态监测投了3月没效果?先排查4实施误区

    误区一:把“监测”当“诊断”典型表现—平台弹出“振动超限”,维修工到现场仍不知道问题在哪——是轴承、齿轮还是不平衡?最终只能拆机检查,监测系统形同虚设。问题根源—在线监测的核心作用是发现异常,而不是
    的头像 发表于 04-14 17:01 609次阅读
    设备状态监测投了3<b class='flag-5'>个</b>月没效果?先排查<b class='flag-5'>这</b>4<b class='flag-5'>个</b>实施<b class='flag-5'>误区</b>

    600V MOSFET替代选型的七个关键检查项

    工程师的核心技能。合科泰基于功率器件研发经验,整理出600V高压MOSFET替代选型中需要重点关注的七个检查项。
    的头像 发表于 04-14 09:49 1519次阅读
    600V MOSFET替代选型的<b class='flag-5'>七个</b>关键检查项

    Token中文新译名:「符元」——一文七个维度讲清Token的本质定义

    拒绝“智元”走私语义,维拆解 Token 物理本质,定义 AI 时代唯一真名:「符元」。
    的头像 发表于 03-27 15:23 853次阅读
    Token中文新译名:「符元」——一文<b class='flag-5'>七个</b>维度讲清Token的本质定义

    洁净烘箱、氮气烘箱怎么选?搞懂4疑问,避免踩坑!

    产品质量,而是你没搞懂洁净烘箱、氮气烘箱的适用场景和核心差异!广东展科技作为精密烘箱十大厂家,帮你拆解4高频疑问,手把手教你精准选型,降低生产成本。核心疑问解答
    的头像 发表于 03-23 15:24 184次阅读
    洁净烘箱、氮气烘箱怎么选?搞懂<b class='flag-5'>这</b>4<b class='flag-5'>个</b>疑问,<b class='flag-5'>避免</b>踩坑!

    变频器应用误区的探讨

    变频器在应用过程中确实存在一些常见的误区,这些误区如果不加以注意和纠正,可能会对变频器的性能、寿命以及整个系统的稳定性产生不良影响。
    的头像 发表于 03-13 16:46 471次阅读

    导热系数越高越好?关于导热硅胶片的三认知误区

    。本文将揭示三最常见的认知偏差,帮助您做出更明智的选择。 误区一:导热系数越高,散热效果就一定越好 这可能是最具迷惑性的误区。理论上,导热系数越高,材料传导热量的能力越强。然而在实际应用中,散热
    发表于 03-12 13:49

    运动控制伺服闭环PID参数调整的误区

    在运动控制中,伺服闭环PID参数调整往往是决定系统性能的关键。很多工程师在面对系统响应慢、震动或超调时,第一反应就是“继续调P、调I、调D”。然而,往往是一最大的误区。 单纯地“死磕”PID参数
    的头像 发表于 03-08 12:08 1464次阅读
    运动控制伺服闭环PID参数调整的<b class='flag-5'>误区</b>

    广东展的快速温变箱 vs 冷热冲击箱:原理差异与适用工况如何界定?

    快速温变箱与冷热冲击箱在原理、适用场景及测试目的上存在显著差异,选型需结合实际工况精准选择,避免误区
    的头像 发表于 02-27 09:39 274次阅读
    广东<b class='flag-5'>宏</b>展的快速温变箱 vs 冷热冲击箱:原理差异与适用工况如何界定?

    在并联使用MOS存在一些问题,要怎样做才能避免这些问题?

    在并联使用MOS存在一些问题,那我们要怎样做才能避免这些问题? 首先,器件的一致性一定要好。 在功率MOSFET多管并联时,器件内部参数的微小差异就会引起并联各支路电流的不平衡而导致单管过流损坏。 其次是功率。如果功率高于25%,MOS发热严重,性能会急剧下降,因此在设计
    发表于 12-10 08:19

    C语言中的内联函数与

    在C编程中,内联函数和都用于避免函数调用的开销并编写可复用的逻辑部分,但它们在工作方式和安全性方面存在显著差异。
    的头像 发表于 07-25 15:10 2157次阅读
    C语言中的内联函数与<b class='flag-5'>宏</b>

    成功使用工业化超声波清洗设备的七个实用技巧

    成功使用工业化超声波清洗设备的七个实用技巧工业化超声波清洗设备在现代制造业中起到至关重要的作用,但要充分发挥它们的效能,需要掌握一些实用技巧。本文将为您介绍成功使用工业化超声波清洗设备的七个实用技巧
    的头像 发表于 06-25 17:33 831次阅读
    成功使用工业化超声波清洗设备的<b class='flag-5'>七个</b>实用技巧