C语言基础 | 您所在的位置:网站首页 › 宏定义返回值 › C语言基础 |
函数式宏是在编译时展开并填入程序的 而函数定义则需要为每个形参都定义各自的数据类型,返回值类型也只能为一种。函数更为严格。 函数默默的为我们进行一些复杂的操作,比如: 参数传递(将实参值赋值给形参)函数调用和函数返回操作返回值的传递而函数式宏只是做宏展开,并不做上述处理。 函数式宏能是程序的运行速度稍微提高一点儿,但是当函数中有大量的宏替换的时候,又会使得程序变得臃肿。(原理是宏函数只做替换,并没有类似函数调用的跳转、参数出入栈等操作,自然会提高函数的运行速度。这种运行速度加快体验在大量使用的时候尤为明显) 宏在使用的时候必须小心谨慎,避免出现问题。这一点是有宏的本身特性决定,即只做替换不做计算。举例来说明: 宏的副作用 情况一: #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 实验室设备网 版权所有 |