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

    文章

    4408

    浏览量

    66953
  • 代码
    +关注

    关注

    30

    文章

    4947

    浏览量

    73270
  • 编译器
    +关注

    关注

    1

    文章

    1670

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    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 1694次阅读

    C语言中的内联函数

    在C编程中,内联函数都用于避免函数调用的开销并编写可复用的逻辑部分,但它们在工作方式和安全性方面存在显著差异。
    的头像 发表于 07-25 15:10 1741次阅读
    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

    明电子创业板IPO获得受理

    近日,深交所官网显示,成都明电子股份有限公司(以下简称“明电子”)创业板IPO获得受理。
    的头像 发表于 06-06 11:16 996次阅读

    详解RTOS中的Hook函数

    Hook函数是RTOS中的一个关键特性,通过该函数,用户可以增强对任务管理的控制,定义系统行为。
    的头像 发表于 03-24 16:14 863次阅读

    使用cubemx配置硬件spi使用硬件nss片,片一直是低的,不能置高,这正常吗?

    使用cubemx 配置硬件spi 使用硬件nss片,按照道理来讲应该是读写的时候 片拉低,但是现在的现象是,片一直是低的,不能置高。用的是硬件片
    发表于 03-14 06:07

    在STM32H5上使用fatfs写函数时用不了DMA的写方式,应该怎么使用呢?

    请问在STM32H5上使用fatfs写函数时,用不了DMA的写方式,应该怎么使用呢,有人遇到过类似的问题嘛
    发表于 03-12 07:10

    EPLAN 2.6 3D制作与使用

    电子发烧友网站提供《EPLAN 2.6 3D制作与使用.pdf》资料免费下载
    发表于 03-11 15:53 1次下载

    LED户外显示屏应该什么样的比较好呢?

    户外LED显示屏应该什么样的比较好呢?LED电子大屏幕是科技与媒体的完美结合,它能把梦幻、科技、潮流、时尚的理念淋淋尽致地展现出来, 完全可以当仁不让地成为舞美新势力新的室内大型LED屏幕
    的头像 发表于 02-13 14:58 1319次阅读
    LED户外显示屏<b class='flag-5'>应该</b><b class='flag-5'>选</b>什么样的比较好呢?

    是德33220A 函数任意波形发生器

    是德33220A 函数任意波形发生器 仪器特性 *33220A 函数发生器包括 USB、GPIB 和 LAN 接口 *用于信号设置视觉验证的图形模式 *件 001 提供支持同步信道的多元链路
    的头像 发表于 02-07 15:55 687次阅读

    常州市领导莅临微科技走访调研

    近日,常州市市长周伟一行莅临江苏微科技股份有限公司(以下简称微科技)新竹厂区走访调研。
    的头像 发表于 01-08 16:24 1021次阅读

    景智驾总部落地衢州

    近日,景智驾衢州总部落地仪式在南孔圣地衢州东方桥庵里大酒店盛大举行!衢州智造新城党工委副书记、管委会常务副主任巫建民与景智驾创始人及CEO刘飞龙博士共同为落地仪式剪彩。
    的头像 发表于 12-24 17:10 1221次阅读