内联函数——解决宏缺陷问题

本文探讨了内联函数如何弥补宏函数的局限,如避免副作用、提升效率。通过案例分析了宏函数的常见问题,并介绍了内联函数的使用场景、注意事项和编译器行为。重点讲解了内联函数的自动内联和限制,以及它在解决宏缺陷中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内联函数


    目的:代替宏函数的
    内联函数的引出——宏函数的缺陷
    


宏函数的缺陷


case 1:


//定义一个加法

#define MyAdd(x,y) ((x)+(y))

void test18() {
    int ret = MyAdd(10, 20) * 20;//预期600,实际是410,加括号可以处理
    cout << ret << endl;
}


case 2:

#define MyCompare(a,b) ((a)<(b))?(a):(b)

void test19() {
    int a = 10;
    int b = 20;
    int ret = MyCompare(++a, b);//预期11结果12(两次++a)
    cout << ret << endl;
}

case 3:


    宏函数没有作用域


    
内联函数 

inline void myCompare(int a, int b) {
    int ret = a < b ? a : b;
    cout << ret << endl;
}

void test20() {
    int a = 10;
    int b = 20;
    myCompare(++a, b);//11
}

内联函数注意事项


    类内部的成员函数默认加inline关键字

inline void func();//内联函数声明
inline void func() {};//如果函数实现时没有加inline关键字就不算内联函数

    内联函数的确占用空间,但是内联函数相对于普通函数的优势只是省去了函数调用时候的压栈、跳栈、返回的开销。我们可以理解为以空间换时间。
    
    成员函数默认加inline关键字为内联函数
    


内联函数有一些限制,以下情况不会进行内联编译:


    1.不能存在任何形式的循环语句;
    2.不能存在过多的条件判断语句;
    3.函数体不能过于庞大;
    4.不能对函数进行取址操作。


    
内联函数  解决宏缺陷问题


    给编译器一个建议 加上关键字 编译器不一定按照内联处理
    不加关键字 也许会自动加inline
    成员函数 默认加上关键字 加上也不一定按内联处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值