BZ易风

导航

 

早期作用是用来代替宏

宏函数的缺陷

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

//缺陷1:没有类型
//#define MyAdd(x,y) x+y
//解决方法:加括号
#define MyAdd(x,y) ((x)+(y))

void test101()
{
    int ret = MyAdd(10, 20) * 20;    //预期结果600 结果是410  10+20*20  加括号后值为600
    cout << "ret=" << ret << endl;
}

//缺陷2:
#define MyCompare(a,b) ((a)<(b))?(a):(b)        //返回最小值
void test102()
{
    int a = 10;
    int b = 20;

    int ret = MyCompare(a, b);    //预期: ((a)<(b))?(a):(b)  返回10 没有问题
    int ret = MyCompare(++a, b);    //预期:11 ((++a)<(b))?(++a):(b) 结果:12
    cout << "ret = " << ret << endl;
}
//缺陷3:宏函数没有作用域

int main()
{
    test101();
    system("Pause");        //阻塞功能
    return EXIT_SUCCESS;    // 返回正常退出
}

内联函数

保留宏函数的短小可替代,不用在内存开辟栈,省去函数调用的开销的优点,又不会像宏一样出现不可预期的错误

inline int func(int a) {return ++;}  //会把函数func(int a)替换成大括号的内容 

注意事项

1.类的成员函数 默认会在前面加上inline关键字

2.声明和实现分开写的时候都要加inline关键字

inline void func();    //内联函数声明
inline void func() { };    //如果函数实现的时候没有加inline关键字,那么这个函数依然不算内联函数

优点

空间换时间,省去函数调用的开销时间

限制

1.不能存在任何形式的循环语句

2.不能存在过多的条件判断语句

3.函数体不能过于庞大

4.不能对函数进行取址操作

 

posted on 2021-08-10 12:41  BZ易风  阅读(51)  评论(0编辑  收藏  举报