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

    文章

    4406

    浏览量

    66839
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    USB3.1传输能用极细同轴线吗?要注意哪些选型误区

    极细同轴线束确实能够用于 USB3.1 的高速传输,但前提是做好完整的设计与验证工作。若能避开“线越细越好”这样的误区,合理平衡电气性能、机械性能与工艺可行性,才能真正发挥极细同轴线束在小型化、高速化产品中的优势。
    的头像 发表于 09-26 14:28 1335次阅读
    USB3.1传输能用极细同轴线吗?要注意哪些选型<b class='flag-5'>误区</b>?

    C语言中的内联函数与

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

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

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

    使用集TELE NA003-M64继电器,避免光伏发电系统的异常电流馈入电网

    如何避免光伏发电因不稳定而损害电网?使用集NA003-M64电力保护器即可帮您监测电流,实现电网和系统保护!
    的头像 发表于 05-22 11:08 548次阅读
    使用<b class='flag-5'>宏</b>集TELE NA003-M64继电器,<b class='flag-5'>避免</b>光伏发电系统的异常电流馈入电网

    避坑指南:选购电动牙刷气密检测仪的5致命误区

    的“守门员”,其选购直接关乎企业成本与风险。然而,许多厂商在设备选型时常因认知偏差踩中以下5大误区,最终付出高昂代价。误区一:只看价格低,忽视参数匹配问题:部分厂商为节省
    的头像 发表于 03-25 15:44 492次阅读
    避坑指南:选购电动牙刷气密检测仪的5<b class='flag-5'>个</b>致命<b class='flag-5'>误区</b>

    滤波器接地设计有哪些常见误区

    滤波器接地设计对电子设备EMC至关重要,需避免接地线过长、壳体搭接不良、输入输出线平行走线、接地线过细及忽视高频特性等误区,采用短接地线、良好搭接、分开布线、合适接地材料及优化布局等方法提高滤波器性能。
    的头像 发表于 02-26 17:23 652次阅读
    滤波器接地设计有哪些常见<b class='flag-5'>误区</b>?

    如何避免直流负载箱的常见操作误区

    以下是一些避免直流负载箱常见操作误区的方法: 选型与安装 正确选型:根据实际需求,准确选择直流负载箱的额定电压、额定电流等参数,使其与被测设备相匹配,避免因参数不匹配导致过载或欠载现象。 合理安装
    发表于 02-13 13:49

    ABB能源自动化选用集Cogent DataHub避免DCOM问题,实现高效、安全的数据传输

    ABB能源自动化公司通过集Cogent DataHub隧道/镜像解决方案,将电厂设施的数据实时传输到公司办公室,避免了传统DCOM方式带来的风险,在电厂和公司网络之间建立了一安全、可靠的连接。
    的头像 发表于 02-12 10:56 672次阅读
    ABB能源自动化选用<b class='flag-5'>宏</b>集Cogent DataHub<b class='flag-5'>避免</b>DCOM问题,实现高效、安全的数据传输

    ADS805E的转换结果要延后六采样周期才输出吗?

    采样周期的数据是无效的,从第七个采样周期开始才为有效数据?即第七个采样周期开始数据有效,Analog In中的N+6点对应的转换后的Data Out中的N
    发表于 01-23 07:50

    低通滤波器的常见误区

    ,但在设计和使用过程中,工程师和技术人员可能会遇到一些误区误区一:低通滤波器可以完全去除高频信号 误区解析: 低通滤波器的设计目的是减少高频信号的影响,但它们并不能100%地去除所有高频成分。滤波器的性能受到其截止频率、滤波
    的头像 发表于 01-21 10:02 1156次阅读

    OTL电路设计中的常见误区

    输出变压器 OTL电路的名称可能会让人误以为它完全不需要变压器。实际上,OTL电路中的“无输出变压器”是指不需要传统的音频输出变压器,但可能仍然需要一直流偏置变压器来为输出级提供适当的偏置电压。 避免方法: 在设计OTL电路时,应充分
    的头像 发表于 01-16 09:39 784次阅读

    漏电开关使用误区及纠正

    漏电开关是现代电气安全中不可或缺的一部分,它能够在检测到漏电时迅速切断电源,从而保护人身安全和设备不受损害。然而,在实际使用过程中,由于对漏电开关的认识不足或操作不当,常常会出现一些误区误区
    的头像 发表于 12-30 17:18 1221次阅读

    无线充电原理的常见误区

    随着智能手机和其他便携式设备的普及,无线充电技术越来越受到关注。然而,尽管这项技术已经取得了显著进展,但公众对其工作原理和能力的理解仍然存在一些误区误区一:无线充电是新技术 误区解释: 许多人
    的头像 发表于 12-28 13:51 1088次阅读

    DFT的常见误区与解决方案

    DFT(离散傅里叶变换)在信号处理领域具有广泛的应用,但在使用过程中也常会遇到一些误区。以下是对DFT常见误区的总结以及相应的解决方案: 常见误区 混叠现象 : 误区描述:在采样过程中
    的头像 发表于 12-20 09:32 2075次阅读

    其利天下技术·电机控制SVPWM段式算法·无刷电机驱动方案

    两种。今天我们先介绍下段式算法如何应用到电驱系统进行电磁兼容性仿真。段式是一种更复杂的SVPWM控制技术,可以将三相电机的输出电压分解为七个矢量,分别为正向最
    的头像 发表于 12-11 10:28 3262次阅读
    其利天下技术·电机控制SVPWM<b class='flag-5'>七</b>段式算法·无刷电机驱动方案