永发信息网

c语言为什么会出现错误:重定义,相同的基函数

答案:1  悬赏:10  手机版
解决时间 2021-02-23 22:53
c语言为什么会出现错误:重定义,相同的基函数
最佳答案
我们以下面两行代码为例,描述:函数式宏定义:#defineMAX(a,b)((a)>(b)?(a):(b))普通函数:MAX(a,b){returna>b?a:b;}(1)函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以传参时要格外小心。(2)调用真正函数的代码和调用函数式宏定义的代码编译生成的指令不同。如果MAX是个普通函数,那么它的函数体returna>b?a:b;要编译生成指令,代码中出现的每次调用也要编译生成传参指令和call指令。而如果MAX是个函数式宏定义,这个宏定义本身倒不必编译生成指令,但是代码中出现的每次调用编译生成的指令都相当于一个函数体,而不是简单的几条传参指令和call指令。所以,使用函数式宏定义编译生成的目标文件会比较大。(3)函数式宏定义要注意格式,尤其是括号。如果上面的函数式宏定义写成#defineMAX(a,b)(a>b?a:b),省去内层括号,则宏就成了k=(i&0x0f>j&0x0f?i&0x0f:j&0x0f),运算的优先级就错了。同样道理,这个宏定义的外层括号也是不能省的。若函数中是宏替换为++MAX(a,b),则宏就成了++(a)>(b)?(a):(b),运算优先级也是错了。(4)若函数参数为表达式,则普通函数的调用与函数式宏定义的替换过程是不一样的。普通函数调用时先求实参表达式的值再传给形参,如果实参表达式有SideEffect,那么这些SideEffect只发生一次。例如MAX(++a,++b),如果MAX是普通函数,a和b只增加一次。但如果MAX函数式宏定义,则要成k=((++a)>(++b)?(++a):(++b)),a和b就不一定是增加一次还是两次了。所以若参数是表达式,替换函数式宏定义时一定要仔细看好。5)函数式宏定义往往会导致较低的代码执行效率。看下面一段代码:复制代码代码如下:inta[]={9,3,5,2,1,0,8,7,6,4};intmax(n){returnn==0?a[0]:MAX(a[n],max(n-1));}intmain(){max(9);return0;}若是普通函数,则通过递归,可取的最大值,时间复杂度为O(n)。但若是函数式宏定义,则宏为(a[n]>max(n-1)?a[n]:max(n-1)),其中max(n-1)被调用了两遍,这样依此递归下去,时间复杂度会很高。尽管函数式宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧、传参、传返回值等一系列工作,因此那些简短并且被频繁调用的函数经常用函数式宏定义来代替实现。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
谁帮我取个好听点的、唯美点的带特殊符号的空
不够英语怎么说
烧鸡汤为什么会变酸
for(i=0;i<4;i++,i++) printf("+");输出什么
猴头菇椰汤怎么做
兴旺小酒馆我想知道这个在什么地方
足球比赛中在禁区内守方球员因犯规被判罚直接
剑网2里少林俗家怎么加点最好?
妈咪宝贝庙前店地址在什么地方,想过去办事
生活的乐趣是什么?
已知三角形ABC中,AD为中线,P为AD上的任一点
普通协警不犯错误会被除名吗
邮政储蓄银行手机银行支付密码忘了怎么办?
take sb.for sb.与 take sb.as sb.怎么区别
AutoCAD设置基准的命令是什么
推荐资讯
蒋家面馆我想知道这个在什么地方
D开头的香水有哪些?
东门横街地址有知道的么?有点事想过去
【中国锈石有几种,分布在哪里?】
夜来非是什么意思网络
方兴瓦直销怎么去啊,有知道地址的么
报考教育局公务员,要求基层教育工作满五年是
惠诚滋味我想知道这个在什么地方
太阻能里能装多少水我家里的是天普太阳能一般
耻辱的反义词是
中国农业银行威海卧龙山分理处地址在哪,我要
剑三怎么解散帮会
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?