问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-05-07 05:21

我来回答

1个回答

热心网友 时间:2023-10-16 18:41

我们以下面两行代码为例,描述:函数式宏定义:#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)被调用了两遍,这样依此递归下去,时间复杂度会很高。尽管函数式宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧、传参、传返回值等一系列工作,因此那些简短并且被频繁调用的函数经常用函数式宏定义来代替实现。

热心网友 时间:2023-10-16 18:41

我们以下面两行代码为例,描述:函数式宏定义:#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)被调用了两遍,这样依此递归下去,时间复杂度会很高。尽管函数式宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧、传参、传返回值等一系列工作,因此那些简短并且被频繁调用的函数经常用函数式宏定义来代替实现。

热心网友 时间:2023-10-16 18:41

我们以下面两行代码为例,描述:函数式宏定义:#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)被调用了两遍,这样依此递归下去,时间复杂度会很高。尽管函数式宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧、传参、传返回值等一系列工作,因此那些简短并且被频繁调用的函数经常用函数式宏定义来代替实现。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
畅享好还是荣耀好 怎么向老师请教问题?? ...和是40.15较大数的小数点向左移动一位就等于较小的数,这两_百度知... 两个数的和是40.15,较大数的小数点向左移动一位就等于较小的数这两... 两个数的和是40.15,较大的数的小数点像向左移动一位就等于较小的数... 两个数的和是40.15,较大数的小数点向左移动一位等于较小的数 ...和是40.15较大数的小数点向左移动一位就等于较小的数这两个数分别... 怎么用手机查询农行信用卡余额? 朝阳公园附近有孩子可以托管的地方吗? 华泰证券怎么添加第二张银行卡 如何 修改Visual Studio C++ 2015 那些配置的宏 ----宏 与 符号常量----请高手指教一下。。本人菜鸟~~刚学。。谢谢 #define 重定义函数问题 关于C++宏定义问题 茶杯泰迪长大后能蹦上沙发吗 windows宏定义问题 winuser.h和resource.h宏重定义问题 c语言宏定义如何用?用宏定义有什么优点? 小红懂得了珍惜时间作文 C++宏可以被多次重新定义吗? 查账征收改为核定征收怎么办理 要什么手续 核定征收需要网上申报吗 个人经营所得税核定征收怎么申请,哪里能办? 请叫一下各位怎么办理核定征收? 广州梵泰代理的晓星pokm330f能过头戴耳机的折叠测试吗? 先锋SE-MJ512折叠式头戴耳机,怎么样?用过的说下。 word2003怎么使文本显示在单独一页? 求推荐头戴式耳机,降噪,轻便,最好有一些折叠,带着舒服的耳机,价格区间在500~1000左右。 素质拓展训练的起源 拓展训练是什么意思 推荐几款联想笔记本电脑 只要16-17寸 联想有没有17寸的笔记本电脑 成年茶杯泰迪几个月长牙 有没有人用17寸的笔记本 貌似 华硕的不错 能当台式机用吗 MFC中的CANCEL重定义 为什么17寸的笔记本会很贵? c语言中报错:重定义,不同的基类型。求解释~ 华硕17寸笔记本电脑怎么样 关于DWORD和宏,高手指教 初始化gpio时如何配置重定义功能 C++头文件为什么要一个该 头文件的宏定义 求 贝瓦 好宝宝简谱 这是歌词天蓝蓝,白云飘,背起小书包。 花儿开, 背起小书包是什么儿歌? 如何锻炼腰部肌肉?还有怎样使膝盖有力? 如何锻炼腰部、膝盖? 腰和膝盖不好的人,如何进行运动锻炼 凉席有特别大的汗味怎么办 怎样能去掉凉席上的汗味 竹席全是汗味,怎么办, 凉席发臭是怎么回事啊?