C拾遗(三)函数式宏定义

来源:互联网 发布:874是什么意思网络语言 编辑:程序博客网 时间:2024/06/06 00:54

#define MAX(a,b)   ((a)>(b)?(a):(b))

int max=MAX(x%10,y*2);

 

预处理之后的代码:

int max=((x%10)>(y*2)?(x%10):(y*2));

 

类似函数调用,把两个实参替换成宏定义中的两个形参的位置,但是函数式宏定义与真正的函数还是有很多区别:

1.函数式宏定义中的参数没有类型,预处理只负责做形式上的替换,不会去检查参数的类型,所以传参时要注意

2.编译生成的指令不同,真正的函数在编译时首先函数体要生成指令,然后每次在代码中的调用都要编译成传参指令与call调用指令,但是函数式宏定义本身不会被编译成指令,而是在每次代码调用处编程成整个函数体指令,不是简单的传参指令和call调用指令。所以用函数式宏定义生成最终的目标文件要比正常的函数生成的要大

3.函数式宏定义在调用时只是形式上的替换,但是参数或者函数体定义的a或b不一定仅仅是变量,也可能是表达式,所以要充分考虑在替换后的算术优先级,比如上例中的(a)>(b)?(a):(b)去掉括号后变成a>b,那么替换后变成x%10>y*2?x%10:y*2,优先级变了。建议:变量加括号,整体加括号。

4.考虑Side Effect情况,比如MAX(++a,++b),如果MAX是真正函数,在传入参数时,a和b只增加一次,但是如果MAX是宏定义函数,那么替换后就是((++a)>(++b)?(++a):(++b));这肯定不是我们想要的结果。

5.就算没有Side Effect,宏定义函数也会增加代码执行量,降低效率,但是它会让我们省去传参,call调用,return结果等一系列正常函数必须做的事,这也是它存在和大量使用的原因。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 学校六级不让刷分怎么办 英国留学生怎么办申根签证 挂科太多拿不到学位证怎么办 ucl语言班没过怎么办 西澳大学工程挂科怎么办 澳洲语言班没过怎么办2018 杨浦区对口公立小学太差怎么办 公立小学太差了怎么办 澳大利亚出国留学怎么办-语言课程 学校不给释放信怎么办 重修费交不起钱怎么办 不想用家里的钱怎么办 三本学费太贵怎么办 从日本往中国汇款怎么办 学费钱大一没交怎么办 初中孩子和同学相处不好怎么办 使用假护照出国被发现怎么办 酒店忘记退房了怎么办 语言课申请不上怎么办 学会计的应届生想转行怎么办 上班熬不下去了怎么办 墨大选修挂科怎么办 日本签证年收入没有10w怎么办 做生意的办房贷没有薪资流水怎么办 澳洲医保卡丢了怎么办 澳洲爱他美上火怎么办 学信网学籍在籍没交学费怎么办 宝宝从床上摔下来怎么办 狗没打针被咬了怎么办 狗咬了没破皮没出血怎么办 被宠物狗咬了出血了怎么办 让狗咬了下红了怎么办 狗牙齿碰到红了怎么办 加拿大学生签背景调查了怎么办 gpa不到3该怎么办英国 内地学生赴港签证怎么办 学生去日本旅游签证怎么办 澳洲未婚妻签需要单身证明怎么办 高院收到申诉材料怎么办? 辞职出国留学后社保怎么办 高三数学40来分怎么办