C++内联函数与宏定义的区别

宏定义

       宏定义作为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 修饰的函数在运行是没有函数调用的开销的,但是对外又表现出函数的形态。

发布了34 篇原创文章 · 获赞 18 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览