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

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

3天内不再提示

宏和函数应该怎么选

麦辣鸡腿堡 来源:轩哥谈芯 作者:轩哥谈芯 2023-11-01 17:35 次阅读

今天我们来看一下利用宏定义编写类似函数调用的方法和真实的函数有什么区别。

一、宏和函数怎么选?

首先来看一个例子:

#define N 2+2
void main()
{    
    int a = N * N;    
    printf( "a = %d", a);
}

这里,我们得理解宏的工作方式,它是在编译器编译代码之前做的一个纯文本的替换工作,因此,有时候简单宏替换的结果就会和我们预想的结果出现偏差。

比如上面的例子,我们预期 N 为 4,a=16,但实际结果却为 a=8;原因在于宏的作用方式是傻瓜式的文本替换。

在编译之前,编译器首先将宏定义的文本替换到程序体中,这个替换是完全无脑的一个操作,看一下替换结果就知道了。

#define N 2+2
void main()
{    
    int a = 2 + 2 * 2 + 2;    
    printf( "a = %d", a);
}

这也就是我们上一篇文章中讲到的,写宏函数的时候一定要注意括号的应用,多加括号一定是利大于弊的。

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

    关注

    3

    文章

    4331

    浏览量

    62598
  • 代码
    +关注

    关注

    30

    文章

    4787

    浏览量

    68591
  • 编译器
    +关注

    关注

    1

    文章

    1634

    浏览量

    49129
收藏 人收藏

    评论

    相关推荐

    ADS1282没有CS片应该怎样单独给DAC传输数据呢?

    请问DAC1282和ADS1282的SCLK、DIN、DOUT可以接到一起,然后分别连接MCU的SCK、SOMI、SIMO吗? 如果可以的话,ADS1282没有CS片应该怎样单独给DAC传输数据呢? 谢谢
    发表于 11-25 07:35

    SUMIF函数与SUMIFS函数的区别

    SUMIF函数和SUMIFS函数都是Excel中用于条件求和的函数,它们可以帮助用户根据特定的条件对数据进行求和。尽管它们的基本功能相似,但在使用场景和功能上存在一些差异。以下是对这两个函数
    的头像 发表于 10-30 09:51 1064次阅读

    科技拟收购APCB 100%股权

    科技近期发布重要公告,宣布其计划通过全资子公司新加坡胜及PSL,以不超过2.787亿元人民币的现金,全面收购APCB Electronics(Thailand)Co.,Ltd.(简称APCB)的100%股权。此次收购标志着胜
    的头像 发表于 08-12 15:06 552次阅读

    TC387中有__disable_interrupts()关闭所有中断和打开所有中断的函数吗?

    TC387 芯片中有__disable_irq()和__enable_irq()关闭所有中断和打开所有中断的函数吗,请告知
    发表于 08-01 08:22

    请问怎么在自己的工程里添加一个INCLUDE_xTaskGetHandle?

    你好: 我需要使用 xTaskGetHandle 这个API,但是 idf.py menuconfig进去freertos组件里没有这个配置选项 我应该怎么添加一个定义到我的cmakelist里??而不是直接改sdk的文件。
    发表于 06-21 12:39

    webserver获取网页submit应该用什么函数呢?

    各位大神: esp32c3,idfd ubuntu编译,html转为C放在代码里,想获取网页的提交按键进行响应,请问提交“submit”时,C里应该对应的是哪个函数。本人webserver小白,感谢指教!
    发表于 06-18 07:18

    鑫科技即将挂牌上市

    浙江鑫科技股份有限公司(以下简称“鑫科技”)成功获得证监会的批文,即将挂牌上市,这标志着鑫科技将成为资本市场锻造铝合金车轮第一股,迎来产业经营和资本运营双轮驱动的全新发展阶段。
    的头像 发表于 03-11 15:30 782次阅读

    函数指针与回调函数的应用实例

    通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数函数指针可以像一般函数一样,用于调用函数、传递参数。
    的头像 发表于 03-07 11:13 401次阅读
    <b class='flag-5'>函数</b>指针与回调<b class='flag-5'>函数</b>的应用实例

    ​​嵌入式中回调函数的实现方法

    回调函数的命名规范没有固定的标准,但是根据通用惯例和编码规范,回调函数的命名应该能够反映函数的作用和功能,让其他开发者能够快速理解并使用。
    发表于 03-04 14:49 722次阅读

    嵌入式Linux C语言编程程序调试与定义

    在Linux使用gcc编译程序的时候,对于调试的语句还具有一些特殊的语法。gcc编译的过程中,会生成一些,可以使用这些分别打印当前源文件的信息,主要内容是当前的文件、当前运行的函数和当前的程序行。
    发表于 03-01 11:41 1013次阅读

    车载无线充用的超级电容应该怎么

    车载无线充用的超级电容应该怎么? 在选择车载无线充电器使用的超级电容时,有几个关键因素需要考虑。本文将详细介绍超级电容的原理、性能指标以及选购建议,以帮助读者更好地理解和选择适合自己的车载无线
    的头像 发表于 02-03 14:28 2940次阅读

    如何用Rust过程魔法简化SQL函数呢?

    这是 RisingWave 中一个 SQL 函数的实现。只需短短几行代码,通过在 Rust 函数上加一行过程,我们就把它包装成了一个 SQL 函数
    的头像 发表于 01-23 09:43 954次阅读
    如何用Rust过程<b class='flag-5'>宏</b>魔法简化SQL<b class='flag-5'>函数</b>呢?

    磁环电感大小应该怎么才正确

    电子发烧友网站提供《磁环电感大小应该怎么才正确.docx》资料免费下载
    发表于 01-22 09:29 0次下载

    函数指针和指针函数是不是一个东西?

    函数指针的本质是指针,就跟整型指针、字符指针一样,函数指针指向的是一个函数
    的头像 发表于 01-03 16:35 533次阅读
    <b class='flag-5'>函数</b>指针和指针<b class='flag-5'>函数</b>是不是一个东西?

    请问如果要用直流电机代替交流电机,应该怎么?根据是什么?

    大虾们,请问如果要用直流电机代替交流电机,应该怎么?根据是什么?谢谢
    发表于 12-28 06:43