C/C++中宏替换与内联函数的区别:
(1)宏定义define:宏定义不是函数,只是简单地把先编辑好的代码在预处理阶段替换进去,所以在替换时不会进行类型检查什么的而是在编译阶段再去检查代码的正确性;但是内联函数是真正的函数,且具有函数所具有的所有特征
(2)宏定义是单纯的代码替换,所以在宏定义时需要小心优先级以及类型检查等问题,如:
#define mul(N) N*N
int main()
{
mul(2+2);
//mul("hello"); //不会进行类型检查
}
执行结果为:8
因为展开成了:2+2*2+2
因此在宏定义时应该定义为:
#define mul(N) (N)*(N)
此时运行结果为:16
展开后为:(2+2)*(2+2)
(3)内联函数inline:符合条件的内联函数编译器在符号表里放入函数的声明(包括名字、参数类型、返回值类型)。如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表里。在调用一个内联函数时,编译器首先检查调用是否正确(进行类型安全检查,或者进行自动类型转换,当然对所有的函数都一样),内联函数具有局限性一般不要超过10行,否则可能会被编译器放弃转为普通函数,且不能使用循环语句如:while,for和选择语句switch等;内联函数必须第一次调用之前定义,可在类内或类外使用inline关键字声明为内联函数
在C++类中的函数如构造函数析构函数及所有类中定义的函数都默认为内联函数
注意:需要与函数体声明在一起才算是内联函数的:
并非使用了inline关键字,该函数就一定是内联函数,需要经过编译器的允许才能成为内联函数的
class AA
{
public:
void print(); //在类外定义需要在定义前加inline否则不是内联函数
inline void print(){ //是内联函数
.....
}
void print();
void print(){ //类内定义的函数默认是内联函数
}
};
void print(){};//类外定义没加inline关键字不是内联函数
inline void AA::print(){} //类外定义加inline关键字是内联函数
(4)对于C++ 而言,使用宏代码还有另一种缺点:无法操作类的私有数据成员。 内联函数是成员函数时,对象的地址(this)会被放在合适的地方,这也是预处理器办不到的。
(1)内联函数是在宏定义基础上改进的,即有宏定义的速度也比宏定义安全还能访问类中的私有成员等
(2)在C++中一般建议使用内联函数来替代宏定义;但也不推荐都使用内联函数,因为内联函数与宏定义一样是以消耗内存为代价的,过度使用内联函数会导致程序过于耗费内存空间
版权声明:本文为takashi77原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。