内联函数(C99)

本文详细解释了内联函数的概念,包括其定义要求(需在同一文件中)、编译器如何处理内联函数的展开,以及inline的使用限制,强调了内联函数定义一致性的重要性,并推荐将其放置在头文件中以简化管理。
摘要由CSDN通过智能技术生成

标准规定具有内部链接的函数可以成为内联函数,还规定了内联函数的定义以调用改函数的代码必须在同一个文件中。因此,最简单的方法是使用函数说明符inline和存储类别说明符static。通常,内联函数应定义在首次使用它的文件中,所以内联函数也相当于函数原型。

#include <stdio.h>
inline static void eatline()   //内联函数定义/原型
{
    while (getchar() !='\n')
        continue;
}

int main()
{
    ...
    eatline();        //函数调用
    ...
}

编译器查看内联函数的定义(也是原型),可能会用函数体中的代码替换eatline()函数调用。也就是说,效果相当于在函数调用的位置输入函数体中的代码:

#include <stdio.h>
inline static void eatline()   //内联函数定义/原型
{
    while (getchar() !='\n')
        continue;
}

int main()
{
    ...
    while (getchar() !='\n')  //替换函数调用
        continue;
    ...
}

由于并未给内联函数预留单独的代码块,所以无法获得内联函数的地址。另外,内联函数无法在调试器中显示。

inline使用限制

inline 的使用是有所限制的,inline 只适合涵数体内代码简单的涵数使用,不能包含复杂的结构控制语句例如 while、switch,并且不能内联函数本身不能是直接递归函数(即,自己内部还调用自己的函数)。

inline 函数仅仅是一个对编译器的建议,所以最后能否真正内联,看编译器的意思,它如果认为函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,声明内联只是一个建议而已。

其次,因为内联函数要在调用点展开,所以编译器必须随处可见内联函数的定义,要不然就成了非内联函数的调用了。所以,这要求每个调用了内联函数的文件都出现了该内联函数的定义

因此,将内联函数的定义放在头文件里实现是合适的,省却你为每个文件实现一次的麻烦。

声明跟定义要一致:如果在每个文件里都实现一次该内联函数的话,那么,最好保证每个定义都是一样的,否则,将会引起未定义的行为。如果不是每个文件里的定义都一样,那么,编译器展开的是哪一个,那要看具体的编译器而定。所以,最好将内联函数定义放在头文件中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值