内联函数及宏函数缺陷

289 阅读2分钟

一、宏函数缺陷

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关键字。