内联函数与宏定义的区别

内联函数与宏定义
  在C中,常用预处理语句#define来代替一个函数定义。例如:
    #define MAX(a,b) ((a)>(b)?(a):(b))
  该语句使得程序中每个出现MAX(a,b)的地方都被宏定义中后面的表达式((a)>(b)?(a):(b))所替换。

  宏定义语句的书写格式有过分的讲究, MAX与括号之间不能有空格,所有的参数都要
  放在括号里。尽管如此,它还是有麻烦:
    int a=1,b=0;
    MAX(a++,b); //a被增值2次
    MAX(a++,b+10); //a被增值1次
    MAX(a,"Hello"); //错误地比较int和字符串,没有参数类型检查
    MAX( )函数的求值会由于两个参数值的大小不同而产生不同的副作用。
    MAX(a++,b)的值为2,同时a的值为3;
    MAX(a++,b+10)的值为10,同时a的值为2。
  如果是普通函数,则MAX(a,"HellO")会受到函数调用的检查,但此处不会因为两个参数类型不同而被编译拒之门外。幸运的是,通过一个内联函数可以得到所有宏的替换效能和 所有可预见的状态以及常规函数的类型检查:
    inline int MAX(int a,int b)
    {
     return a>b?a:b;
    }

1.内联函数与宏的区别:

       传统的宏定义函数可能会引起一些麻烦。

       ex:

            #define F(x) x+x

            void main(){int i=1;F(i++);}

             这里x将被加两次。

         内联函数被编译器自动的用函数的形势添加进代码,而不会出现这种情况。

         内联函数的使用提高了效率(省去了很多函数调用汇编代码如:call和ret等)。

2.内联函数的使用:

          所有在类的声明中定义的函数将被自动认为是内联函数

         class A()

        {

              void c();// not a inline function;

             void d(){ print("d() is a inline function.");}

         }

         如果想将一个全局函数定义为内联函数可用,inline 关键字。

         inline a(){print("a() is a inline function.");}

注意:

       在内联函数中如果有复杂操作将不被内联。如:循环和递归调用。

总结:

       将简单短小的函数定义为内联函数将会提高效率。

1.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
c用宏定义,c++用inline

你可能感兴趣的:(编译器,function,汇编,class,语言,c)