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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值