一、宏函数缺陷
1.缺陷->必须保证运算完整性,需要加小括号修饰
#define MYDD(x,y)x+y;
//#define MYDD(x,y)((x)+(y)); //加上小括号 保证运算正确
void test01)()
{
int a=10;
int b=20;
int ret=MYDD(a,b)*20 //预期结果600 宏展开后 由于符号优先级 变成10+20*20
cout<<" a+b = "<<ret<<endl;
}
2.缺陷->即便加入括号修饰,有些情况依然出现和预期不符的结果
#define MYCOMPARE(a,b) a<b?a:b
//#define MYCOMPARE(a,b)(((a)<(b))?(a):(b))
void test02()
{
int a=10;
int b=20;
int ret=MYCOMPARE(++a,b);//预期结果a=11
cout<<" ret = "<<ret<<endl; //运行结果(((++a)<(b))?(++a):(b)) a=12
}
3.缺陷->不重视作用域
引出内联函数
二、内联函数
1.概念:在C++中,预定义宏的概念是用内联函数来实现的,而内联函数本身也是一个真正的函数。内联函数具有普通函数的所有行为,唯一不同之处在于内联函数会在适当的地方像预定义宏一样展开,所以不需要函数调用的开销。(理解为以空间换时间)
在普通函数(非成员函数)前面加上inline 关键字使之成为内联函数,但必须注意函数体和声明需结合在一起,否则编译器将其作为普通函数来处理。
inline void func(){ };
类-内部成员函数 默认前面加了inline关键字
以下情况编译器可能考虑不会将函数进行内联编译:
1)不能存在任何形式的循环语句
2)不能存在过多的条件判断语句
3)函数体不能过于庞大
4)不能对函数进行取址操作
总结:内联函数仅仅只是给编译器一个建议,编译器不一定会接受这种建议,如果没有将函数声明为内联函数,那么编译器可能将函数做内联编译。一个好的编译器会内联小的、简单的函数,隐藏的加入了inline关键字。