C语言基础 您所在的位置:网站首页 宏定义返回值 C语言基础

C语言基础

2024-07-03 11:56| 来源: 网络整理| 查看: 265

函数式宏是在编译时展开并填入程序的

而函数定义则需要为每个形参都定义各自的数据类型,返回值类型也只能为一种。函数更为严格。

函数默默的为我们进行一些复杂的操作,比如:

参数传递(将实参值赋值给形参)函数调用和函数返回操作返回值的传递

而函数式宏只是做宏展开,并不做上述处理。

函数式宏能是程序的运行速度稍微提高一点儿,但是当函数中有大量的宏替换的时候,又会使得程序变得臃肿。(原理是宏函数只做替换,并没有类似函数调用的跳转、参数出入栈等操作,自然会提高函数的运行速度。这种运行速度加快体验在大量使用的时候尤为明显)

宏在使用的时候必须小心谨慎,避免出现问题。这一点是有宏的本身特性决定,即只做替换不做计算。举例来说明:

宏的副作用

情况一:

#define sqr(a) ((a)*(a))

若调用该函数式宏计算sqr(a++),展开后就变为:((a++) * (a++)),可以发现a执行了两次自增操作。这就会造成隐形的错误,比如我只是想将a自增1后在求其平方,但是结果却并非我们所想。

情况二:

宏定义与宏函数

假如我们在sqr 和’('之间多敲了一个空格,如下

#define sqr (a) ((a)*(a))

那么此时函数式宏就变成了,宏定义了,也成对象式宏。即sqr会被编译器替换成(x) (x)*(x)

在定义宏函数的时候注意宏函数名和’('之间不能有空格。

情况三:

#define sum(x,y) x + y //注意:不规范的函数式宏的定义 //调用 z = sum(a,b) * sum(c,d); //编译器将其展开后就变为: z = a + b * c + d; //这样是不是偏离了我们的本意

因此,我们在定义函数式宏的时候与一定要每个参数以及整个表达式都用()括起来,就不会出错了。上面的就可以改为

#define sum(x,y) ((x) + (y)) //正确的定义方法 //调用 z = sum(a,b) * sum(c,d); /编译器将其展开后就变为: z = ((a) + (b)) * ((c) + (d));

总结,在定义和使用函数式宏的时候要注意避免其产生副作用



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有