宏定义
宏定义作为C语言里面经常使用的工具,其实就相当于一个标签,在编译预处理时会直接将全部代码中的宏定义进行替换。
在很多方面十分的方便,比如 “ #define MAX(x,y) x > y ? x : y ” 取最大值是十分方便的,但是由于它是预处理时的简单替换,所以会发生一些无法察觉的问题:
#define ADD(x,y) x+y void test(){ int a= ADD(10, 20) * 10; //希望的结果是300 cout << "a:" << a << endl; //所得的结果却是210 } //-----------------其实质就是-------------------- void test(){ int a= x + y * 10; //编译器并不会给其加括号 cout << "a:" << a << endl; }
同样的,自加在宏定义里也要谨慎使用,更不要说是用宏来定义函数了。对于初学者,或者不熟悉项目的程序员,会很容易掉坑里。
#define MULTIPLY(x,y) x*y void test(){ int n = 10; int a= MULTIPLY(10,n++) ; //希望的结果是110 cout << "a:" << a << endl; //所得的结果却是100 } //--------------其实质却是-------------- void test(){ int n = 10; int a= 10 * n++ ; //先乘后自加 cout << "a:" << a << endl; }
内联函数
关于内联函数,它却与宏定义不同。C++编译器在编译时也会对内联函数进行错误分析,编译器会将函数类型(包括函数名字,参数类型,返回值类型)放入到堆栈中。它在某种角度上看,也有点像标签。即内联函数在编译时也会直接替换相应的标签,但是内联函数提供给程序员的样子却是一个函数的形式。
可以把内联函数看做是宏定义的高级版本。inline 修饰的函数在运行是没有函数调用的开销的,但是对外又表现出函数的形态。
© 版权声明
本文刊载的所有内容,包括文字、图片、音频、视频、软件、程序、以及网页版式设计等部门来源于互联网,版权均归原作者所有!本网站提供的内容服务于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
联系信息:邮箱aoxolcom@163.com或见网站底部。
联系信息:邮箱aoxolcom@163.com或见网站底部。
THE END
请登录后发表评论
注册
社交帐号登录