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

    文章

    4306

    浏览量

    62430
  • 代码
    +关注

    关注

    30

    文章

    4748

    浏览量

    68355
  • 编译器
    +关注

    关注

    1

    文章

    1618

    浏览量

    49051
收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    如何规范和常量以及命名

    const double ASPECT_RATIO = 1.653 ; ◎ 除非必要,应尽可能使用函数代替 。 ◎ 将定义的多条表达式放在大括号中。 ◎ 使用时,不允许参数发生
    的头像 发表于 12-07 14:49 679次阅读

    嵌入式C编码中函数的规范

    ◎ 一个函数仅完成一件功能 ◎ 重复代码应该尽可能提炼成函数。 说明:重复代码提炼成函数可以带来维护成本的降低。重复代码是不良代码最典型的特征之一。在“代码能用就不改”的指导原则之下,
    的头像 发表于 12-07 14:33 342次阅读

    你知道滤波电容应该怎么吗?

    一直有个疑惑:电容感抗是1/jwC,大电容C大,高频时 w也大,阻抗应该很小,不是更适合滤除高频信号?
    的头像 发表于 12-06 10:20 2221次阅读
    你知道滤波电容<b class='flag-5'>应该</b>怎么<b class='flag-5'>选</b>吗?

    与晶振并联的1M电阻是什么用?应该怎么

    与晶振并联的1M电阻是什么用?应该怎么
    的头像 发表于 12-04 15:47 1305次阅读
    与晶振并联的1M电阻是什么用?<b class='flag-5'>应该</b>怎么<b class='flag-5'>选</b>?

    if函数三个条件怎么填

    IF函数是Excel中最常用的函数之一,它根据一个逻辑条件的返回结果来决定应该执行哪一个动作。在Excel中使用IF函数可以实现复杂的逻辑判断,应用范围广泛。本文将详细解析IF
    的头像 发表于 12-03 10:28 3449次阅读