今天我们来看一下利用宏定义编写类似函数调用的方法和真实的函数有什么区别。
一、宏和函数怎么选?
首先来看一个例子:
#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-04 14:49
•647次阅读
嵌入式Linux C语言编程程序调试与宏定义
在Linux使用gcc编译程序的时候,对于调试的语句还具有一些特殊的语法。gcc编译的过程中,会生成一些宏,可以使用这些宏分别打印当前源文件的信息,主要内容是当前的文件、当前运行的函数和当前的程序行。
发表于 03-01 11:41
•891次阅读
车载无线充用的超级电容应该怎么选?
车载无线充用的超级电容应该怎么选? 在选择车载无线充电器使用的超级电容时,有几个关键因素需要考虑。本文将详细介绍超级电容的原理、性能指标以及选购建议,以帮助读者更好地理解和选择适合自己的车载无线
如何规范宏和常量以及命名
const double ASPECT_RATIO = 1.653 ; ◎ 除非必要,应尽可能使用函数代替宏 。 ◎ 将宏定义的多条表达式放在大括号中。 ◎ 使用宏时,不允许参数发生
嵌入式C编码中函数的规范
◎ 一个函数仅完成一件功能 ◎ 重复代码应该尽可能提炼成函数。 说明:重复代码提炼成函数可以带来维护成本的降低。重复代码是不良代码最典型的特征之一。在“代码能用就不改”的指导原则之下,
if函数三个条件怎么填
IF函数是Excel中最常用的函数之一,它根据一个逻辑条件的返回结果来决定应该执行哪一个动作。在Excel中使用IF函数可以实现复杂的逻辑判断,应用范围广泛。本文将详细解析IF
评论