内联函数与宏的区别(C++)
1个回答
展开全部
C++中的内联函数提供了宏之上的功能。宏是内联代码的简单实现形式。。不过两者有很大的区别。
内联函数采用的是值传递,而宏定义采用的是对等替换。这一点非常重要,宏定纯碧义没用好,很可能在使用过程中陷入误区。
例如下面这个宏:
#define
MAX(a,
b)
a>b?a:b
当我们这样使用宏时,没有什么问题:
MAX(
num1,
num2
);
因为宏展开后变成
num1>num2?num1:num2;。
但是,如果是这样调用的,MAX(
17+32,
25+21);
呢,编译时出现错误,原因是,宏展开后变成:17+32>25+21?17+32:25+21,Woh,这是什么啊?
所以,宏在使用时,参数一定要加上括号,上述的那个例子改成如下所示就能解决问题了。
#define
MAX(
(a),
(b)
)
(a)>(b)?(a)b)
即使是这样,也不这个宏也还是有Bug,因为如果我这样调用
MAX(i++,j++);
,
经过这个宏以后,i和j都被累加了两次,这绝不乱档是我们想要的。所以,在宏的使用上还是要谨慎考虑,因为宏展开是的结果是很难让人预料的。而且虽然,做陪举宏的执行很快(因为没有函数调用的开销),但宏会让源代码澎涨,使目标文件尺寸变大,(如:一个50行的宏,程序中有1000个地方用到,宏展开后会很不得了),相反不能让程序执行得更快(因为执行文件变大,运行时系统换页频繁)。因此,在决定是用函数,还是用宏时得要小心。
相同点:两者都是在预处理阶段,对代码块,进行替换。。
内联函数采用的是值传递,而宏定义采用的是对等替换。这一点非常重要,宏定纯碧义没用好,很可能在使用过程中陷入误区。
例如下面这个宏:
#define
MAX(a,
b)
a>b?a:b
当我们这样使用宏时,没有什么问题:
MAX(
num1,
num2
);
因为宏展开后变成
num1>num2?num1:num2;。
但是,如果是这样调用的,MAX(
17+32,
25+21);
呢,编译时出现错误,原因是,宏展开后变成:17+32>25+21?17+32:25+21,Woh,这是什么啊?
所以,宏在使用时,参数一定要加上括号,上述的那个例子改成如下所示就能解决问题了。
#define
MAX(
(a),
(b)
)
(a)>(b)?(a)b)
即使是这样,也不这个宏也还是有Bug,因为如果我这样调用
MAX(i++,j++);
,
经过这个宏以后,i和j都被累加了两次,这绝不乱档是我们想要的。所以,在宏的使用上还是要谨慎考虑,因为宏展开是的结果是很难让人预料的。而且虽然,做陪举宏的执行很快(因为没有函数调用的开销),但宏会让源代码澎涨,使目标文件尺寸变大,(如:一个50行的宏,程序中有1000个地方用到,宏展开后会很不得了),相反不能让程序执行得更快(因为执行文件变大,运行时系统换页频繁)。因此,在决定是用函数,还是用宏时得要小心。
相同点:两者都是在预处理阶段,对代码块,进行替换。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询