浅谈C++中宏定义和内联

宏定义和内联函数的区别

相同的目的
节省频繁的函数调用过程中产生的时间和空间开销,提高程序执行效率

宏定义内联函数
字符串替换,不是函数函数
在预处理阶段展开在编译阶段展开
/作为类成员时,可以访问类的所有成员,包括this指针
/完全可以替代宏定义,有益于程序可读性和安全性
/代码膨胀问题

代码膨胀

  • 当内联函数体非常庞大,并且在多处调用,代码展开后的内联函数就会内嵌到程序各处,也就造成了代码体积的极度膨胀。
  • 要确保内联函数体的简单

宏函数和内联函数的使用

宏函数不是函数

宏函数的使用示例:

#define OUTINT(x) cout<<"INT:"<< x <<endl;
#define OUTCHAR(x) cout<<"CHAR:"<< x <<endl;

void out()
{
	int i = 10;
	char c = 'A';
	OUTINT(i);
	OUTCHAR(c);
}

内联函数的例子:

class Rectangle{
private:
	int length;
	int width;
public:
	Rectangle(int,int);
	int getSquare();
	int getGirth(){
		return 2*(length + width);
	}
}

Rectangle::Rectangle(int l,int w):length(l),width(w){}
inline int Rectangle::getSquare(){
	return length*width;
}

Rectangle 类将 getSquare 函数通过 intline 关键字定义为内联函数,在函数声明时使用 intline 起不到任何作用,一定要在定义时使用

在编译阶段,编译器在发现 intline 关键字时会将函数体保存在函数名所在的符号表内,在程序调用内联函数的地方,编译器直接在符号表中获取函数名和函数体,并用内联函数的函数体替换掉函数调用,从而节省了运行时函数调用的开销

如果在函数声明的同时给出函数定义,编译器会自动将函数识别为内联函数。(不推荐使用)

宏函数中的展开错误

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

int main()
{
	int x = 4,y = 2;
	int max = MAX(++ x,y);
	int mul = MUL(x,y + 2);
	cout <<"the max is"<< max << endl;
	cout <<"the mul is"<< mul << endl;
	
	return 0;
}

输出结果(修改前):

the max is 6
the mul is 14

展开后

int max = ++ x > y ? ++ x: y ;   //x 为 6
int mul = x * y + 2;             //6*2+2 = 14

修改代码:

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

输出结果(修改后):

the max is 6   //在三目运算符仍然要加两次
the mul is 24
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值