今天我们来看一下利用宏定义编写类似函数调用的方法和真实的函数有什么区别。
一、宏和函数怎么选?
首先来看一个例子:
#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的,因此,
使用 BSP 助手创建项目并创建 BSP 后,我应该在哪里更改 cy_device_headers.h 中列出的设备名称宏?
使用 BSP 助手创建项目并创建 BSP 后,我应该在哪里更改 cy_device_headers.h 中列出的设备名称宏?例如,我想手动将设备名称从 CY8C4024FNI_S402 更改
发表于 06-26 06:06
使用cubemx配置硬件spi使用硬件nss片选,片选一直是低的,不能置高,这正常吗?
使用cubemx 配置硬件spi 使用硬件nss片选,按照道理来讲应该是读写的时候 片选拉低,但是现在的现象是,片选一直是低的,不能置高。用的是硬件片
发表于 03-14 06:07
在STM32H5上使用fatfs写函数时用不了DMA的写方式,应该怎么使用呢?
请问在STM32H5上使用fatfs写函数时,用不了DMA的写方式,应该怎么使用呢,有人遇到过类似的问题嘛
发表于 03-12 07:10
LED户外显示屏应该选什么样的比较好呢?
户外LED显示屏应该选什么样的比较好呢?LED电子大屏幕是科技与媒体的完美结合,它能把梦幻、科技、潮流、时尚的理念淋淋尽致地展现出来, 完全可以当仁不让地成为舞美新势力新的室内大型LED屏幕
是德33220A 函数任意波形发生器
是德33220A 函数任意波形发生器 仪器特性 *33220A 函数发生器包括 USB、GPIB 和 LAN 接口 *用于信号设置视觉验证的图形模式 *选件 001 提供支持同步信道的多元链路
宏景智驾总部落地衢州
近日,宏景智驾衢州总部落地仪式在南孔圣地衢州东方桥庵里大酒店盛大举行!衢州智造新城党工委副书记、管委会常务副主任巫建民与宏景智驾创始人及CEO刘飞龙博士共同为落地仪式剪彩。

宏和函数应该怎么选
评论