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

    文章

    4423

    浏览量

    68009
  • 代码
    +关注

    关注

    30

    文章

    4983

    浏览量

    74516
  • 编译器
    +关注

    关注

    1

    文章

    1673

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    低成本键盘旋钮开源项目介绍

    办公切软件、调参数太繁琐?创作时控笔刷 / 缩放总找快捷键?商用键盘价格高,还难适配个性化操作需求?想自制键盘,却遇设计复杂、组装难度高的问题?
    的头像 发表于 03-25 11:09 660次阅读

    采购必看:展精密热风烤箱技术解析——选型、性能与成本适配指南

    对于采购而言,精密热风烤箱的选型核心是“适配需求、稳定可靠、性价比高”,无需深入研究复杂的技术原理,但需掌握关键技术指标的实际意义,明确不同技术配置对应的使用场景与成本,避免踩坑。本文结合展精密
    的头像 发表于 03-24 09:25 278次阅读
    采购必看:<b class='flag-5'>宏</b>展精密热风烤箱技术解析——选型、性能与成本适配指南

    微科技首家欧洲全资子公司正式成立

    在国家积极鼓励企业“走出去”及共建“一带一路”倡议的宏大背景下,国内功率半导体领域的领先企业——江苏微科技股份有限公司(以下简称“微科技”)今日宣布,其首家欧洲全资子公司 MacMic
    的头像 发表于 03-04 11:06 729次阅读

    别漏看!广东展告诉你高低温试验箱这些被忽视的性能细节

    客户最易忽略的性能细节疑问1、“设备的噪音和能耗在长期使用中影响大吗?”解答:实验室场景噪音≤65dB的设备(展采用静音压缩机+隔音箱体设计),能耗看COP值(制冷性能系数),展设备COP
    的头像 发表于 12-30 09:46 295次阅读
    别漏看!广东<b class='flag-5'>宏</b>展告诉你高低温试验箱这些被忽视的性能细节

    C语言中实现函数的三种方式

    用 ; 的调用方式无论从程序阅读还是使用方法方面都是十分别扭的;而规定必须使用带花括号的 if 的调用方式有违常理的,因为函数应该适用于任何语法。 优缺点总结: 优点:简单粗暴。 缺点:不能在无花括号且有
    发表于 12-29 07:34

    选购不迷茫:广东展科技总结出通用技术规格选购关键疑问指南

    以下从客户视角出发,梳理不同行业在高低温试验箱技术规格与性能上的核心疑问、选购判断标准,结合展产品优势给出解答,贴合实际采购决策场景:通用核心技术规格疑问1、温域范围怎么?是否越宽越好?客户疑问
    的头像 发表于 12-27 09:38 270次阅读
    选购不迷茫:广东<b class='flag-5'>宏</b>展科技总结出通用技术规格选购关键疑问指南

    泰科技与ADI正式签署合作备忘录

    近日,南京泰半导体科技股份有限公司(以下简称“泰科技”)与全球领先的高性能半导体公司ADI正式签署合作备忘录,双方将在半导体测试与精密信号测量领域展开持续深度合作,共同推动高性能测试系统的技术创新与市场应用落地。
    的头像 发表于 12-02 09:09 1805次阅读

    C语言拼接运算符典型使用

    在C语言中,##运算符(称为[size=16.002px]标记拼接运算符)用于定义中将两个标记(token)拼接成一个新的标记。它在预处理阶段处理,常用于动态生成变量名、函数名或类型名,以提高代码
    发表于 11-20 08:27

    应用层外设进行数据传输,是否应该调用rt_device_create,rt_device_register等函数呢?

    假如我要在应用层用一个新的usart2串口传输数据,那我应该是怎么做? 1.在工程未编译前将usart2加上,即定义BSP_USING_UART2,利用RT-Thread在硬件初始化
    发表于 10-11 06:29

    在rtthread的main函数里用HAL_Delay函数不起作用是哪里的问题?

    函数就没有这个问题。 求大佬提供解决方法 CUBMX的timbase source时钟源的是Systick,优先级是15 main函数里代码如下 运行结果如下(一秒打印了几百
    发表于 09-15 07:53

    详解hal_entry入口函数

    当使用RTOS时,程序从main函数开始进行线程调度;当没有使用RTOS时,C语言程序的入口函数main函数调用了hal_entry函数。由于我们新建的工程是没有选用RTOS的,因此,
    的头像 发表于 07-25 15:34 2300次阅读

    C语言中的内联函数

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

    使用 BSP 助手创建项目并创建 BSP 后,我应该在哪里更改 cy_device_headers.h 中列出的设备名称

    使用 BSP 助手创建项目并创建 BSP 后,我应该在哪里更改 cy_device_headers.h 中列出的设备名称?例如,我想手动将设备名称从 CY8C4024FNI_S402 更改
    发表于 06-26 06:06

    景智驾再获老股东追加投资

    近日,景智驾再次获得老股东博将资本与衢州智远的追加投资。在竞争激烈、技术迭代加速的市场环境下,此次支持彰显了投资方对景智驾核心能力与长期发展潜力的高度认可。
    的头像 发表于 06-09 11:06 1030次阅读

    Vicor助力发打造主动悬架电源系统

    厦门发电声股份有限公司(发)打造业内性能卓越的主动悬架电源系统,旨在将长期以来仅见于豪华车型的功能引入中端车型。发成功突破困扰知名汽车技术供应商几十年的技术瓶颈,在满足主动悬架系统对尺寸、重量及瞬态性能的严苛需求的同时,兼
    的头像 发表于 06-04 15:24 1401次阅读