您的位置:首页 > 其它

define与inline的区别

2017-11-24 20:57 197 查看

#define和inline 的区别

一、内联函数inline

inline: 内联函数对编译器提出建议,是否进行宏替换,编译器有权拒绝 ,既为提出申请,不一定会成功。
    函数调用时都会产生一些额外的开销,主要是系统栈的保护、代码的传递、系统栈的恢复以及参数传递等。对于那些函数体很小、执行时间很短但又频繁使用的函数,定义为内联函数提高函数调用的效率。内联函数不是在调用时发生转移,而是在编译时将函数体嵌入到每个内联函数调用处。这样就省去了参数传递、系统栈的保护与恢复等的时间开销。

    语法形式:<inline><类型标识符><被调函数名>(含类型说明的形参表)

{
函数体
}

    注意:

   1.内联函数以目标代码的增加为代价来换取时间的节省。

   2.内联函数在编译时被替换。

   3.内联函数一般不能含有循环语句和switch语句。

   4.内联函数的定义必须出现在第一次被调用之前。

   5.对内联函数不能进行异常接口说明。

    如果违背了上述注意点中的任意一项,编译程序就会无视关键字inline的存在,像处理一般函数一样处理,不生成扩展代码。

二、#define

#define:定义预编译时处理的宏;只进行简单的字符替换,无类型检测

不带参数的宏定义格式:#define 标识符 字符或字符串

例:#define PI 3.1415926

带参数的宏定义格式:#define 宏名(参数表) 使用参数的字符或字符串

#define SQR(x) x*x
int main()
{
int a,k=3;
a=++SQR(k+1);
printf("%d\n",a);
}


 注意:

1.在宏扩展时,只对宏名做简单的代换,不做任何计算,也不做任何语法检查。

2.宏由编译预处理程序处理。

3.宏定义可出现在程序的任何位置。

4.在宏定义中可以使用已定义的宏名。

5.宏由编译预处理程序处理,而函数由编译程序处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: