内联函数和宏的区别

来源:互联网 发布:淘宝客链接转换api 编辑:程序博客网 时间:2024/06/05 20:08

认识内联函数和宏定义,需要注意以下几点:
1.内联函数在运行时可调试,而宏定义不可以;

2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;
3.内联函数可以访问类的成员变量,宏定义则不能;
4.在类中声明同时定义的成员函数,自动转化为内联函数。

内联函数与宏定义

(1)在C中,常用预处理语句#define来代替一个函数定义。例如: 
    #define MAX(a,b) ((a)>(b)?(a):(b))
  该语句使得程序中每个出现MAX(a,b)函数调用的地方都被宏定义中后面的表达式((a)>(b)?(a):(b))所替换。
(2)宏定义语句的书写格式有过分的讲究, 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。

(3)如果是普通函数,则MAX(a,"HellO")会受到函数调用的检查,但此处(宏定义)不会因为两个参数类型不同而被编译拒之门外。幸运的是,内联函数可以得到所有宏的替换效能和所有可预见的状态,以及常规函数的参数类型检查:
    inline int MAX(int a,int b)
    {
     return a>b?a:b; 
         }

 

===========================================================================================================

 

内联函数关键字为inline和普通的函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函数可以直接被镶嵌到目标代码中,而宏只是一个简单的替换。

内联函数要做参数类型检查,而宏函数则没有。

内联函数是指嵌入代码,就是在调用函数的地方不是跳转,而是把代码直接写到那里去。对于短小的代码来说,inline可以带来一定的效率的提高,而且和C中的宏比较起来,inline函数更安全可靠。但是增加了空间上的消耗。

一般用内联函数的情况:

(1)一个函数被不断的重复调用

(2)函数只是简单的几行,而且函数内不包含for,while,switch语句。

宏是在代码处不加任何验证的简单替代,而内联函数是将代码直接插入到调用的地方,而减少了普通函数调用时的资源消耗。

宏不是函数,只是在编译前将程序中有关字符串替换成宏体。

inline函数是函数,但在编译中不单独产生代码,而是将有关代码嵌入到调用处。


原创粉丝点击