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

    文章

    4332

    浏览量

    62666
  • 代码
    +关注

    关注

    30

    文章

    4790

    浏览量

    68654
收藏 人收藏

    评论

    相关推荐

    Micro USB接口应避免的使用误区

    Micro USB接口在使用中应避免以下几个误区: 一、插拔不当 暴力插拔 :避免直接用手扯着连接插头的电线拉扯或用力拔出。这种暴力的插拔方式可能导致Micro USB接口的插板损坏,甚至导致接口
    的头像 发表于 11-27 10:14 280次阅读

    单片机方案开发-分享七个常用的外围电路设计

    在电子产品电路开发设计中,外围电路设计是连接主控芯片与外部世界的关键桥梁,它直接影响着整个产品的性能、稳定性及功耗。今天,今天英锐恩科技的技术小编跟大家分享七个常用的外围电路设计,助电子工程师们
    发表于 09-24 15:59

    放大器OPA548的七个针脚与电源和负载是怎么接线的?

    请问:放大器OPA548的七个针脚与电源和负载是怎么接线的?
    发表于 09-23 08:19

    段数码管怎么判断共阴共阳

    段数码管是一种常见的显示设备,用于显示数字和字母。它由七个发光二极管(LED)组成,每个LED可以独立控制,以形成不同的数字和字母。段数码管有两种类型:共阴和共阳。这两种类型的数码管在电路连接
    的头像 发表于 08-28 16:17 1687次阅读

    NE5534导入到Pspice只有七个脚,且按照生成的.lib文件对应的管脚连接的电路仿真出错怎么解决?

    NE5534导入到Pspice只有七个脚 且按照生成的.lib文件对应的管脚连接的电路仿真出错 求解NE5534的准确pspice模型
    发表于 08-15 08:10

    必看!光伏并网逆变器的3典型认识误区

    必看!光伏并网逆变器的3典型认识误区-古瑞瓦特 逆变器作为光伏系统的中枢控制器,对整个系统的运行和产出起到关键作用。当系统出现待机、停机、告警、故障、发电量未达预期、数据监控中断等问题时,运维人员
    的头像 发表于 07-11 16:32 1058次阅读
    必看!光伏并网逆变器的3<b class='flag-5'>个</b>典型认识<b class='flag-5'>误区</b>

    家用路由器使用中的误区和解决方案

    家用路由器在使用过程中,用户往往容易陷入一些误区,如忽视设置、过度使用无线信号、不重视网络安全以及忽视保养维护等。这些误区不仅可能影响网络的速度和稳定性,还可能带来安全隐患。因此,了解并避免这些
    的头像 发表于 04-17 11:17 409次阅读

    如何避免工业级路由器使用误区,提高网络效率

    工业级路由器在工业自动化、物联网等领域发挥着至关重要的作用。然而,由于其应用环境的特殊性,使用过程中容易出现一些误区,导致网络效率低下。本文将针对这些误区,提出相应的解决方案,帮助读者避免使用
    的头像 发表于 04-12 14:15 287次阅读

    贴片电容使用的四误区

    贴片电容是一种常用的电子元件,具有优异的性能和可靠性,在各类电路中得到广泛应用。贴片电容在电子电路中起着至关重要的作用,但在使用过程中,存在一些常见的误区。以下是四主要的误区误区
    的头像 发表于 04-12 11:32 431次阅读
    贴片电容使用的四<b class='flag-5'>个</b><b class='flag-5'>误区</b>

    华为MWC2024荣膺项GLOMO大奖,创新驱动移动通信行业发展

    华为在近期举办的MWC 2024会议上,获得了七个GLOMO大奖。GLOMO大奖作为手机通讯行业最著名的奖项,经过业内顶尖专家们的严格评审,赋予了华为终端产业最高的荣誉。
    的头像 发表于 03-05 14:49 960次阅读

    路由器代理商如何避免常见的误区

    作为路由器代理商,要成功在竞争激烈的市场环境中立足,需对常见误区保持清醒认识,并制定相应策略避免。从产品定位、渠道选择和营销策略等方面剖析,为可持续发展提供指导。
    的头像 发表于 03-03 16:51 438次阅读

    分布式控制系统的七个功能和应用

    分布式控制系统的七个功能和应用  分布式控制系统是一种由多个独立的控制单元组成的系统,每个控制单元负责系统中的一部分功能。它具有分散的、自治的特性,可以提高系统的可靠性、灵活性和可扩展性。分布式控制
    的头像 发表于 02-01 10:51 1418次阅读

    微控制器的七个串行接口

    我们将简要介绍七个串行接口:SIO、UART、SSP(SPI)、I2C、CAN、USB和EtherMAC。虽然每个接口都有几个不同的操作模式,但我们只介绍一典型的模式。
    的头像 发表于 01-11 09:30 3043次阅读
    微控制器的<b class='flag-5'>七个</b>串行接口

    低功耗设计的几个误区分享

    误区一:我们系统是220V供电,就不用在乎功耗问题了 点评:低功耗设计并不仅仅是为了省电,更多的好处在于降低了电源模块及散热系统的成本、由于电流的减小也减少了电磁辐射和热噪声的干扰。随着设备
    发表于 01-09 08:04

    轴机械臂,以精准力控实现柔性抛光打磨!

    集推出轴都带有扭矩传感器的柔性机械臂,通过类人类触觉、力位控制策略与直观易用的打磨app,实现均匀一致的打磨效果,打破“被动柔顺”方案的不可控性与精度限制,使表面精加工技术效率和精度大幅提升
    的头像 发表于 01-03 13:36 647次阅读
    <b class='flag-5'>宏</b>集<b class='flag-5'>七</b>轴机械臂,以精准力控实现柔性抛光打磨!