2024/02/20

本文详细比较了C++中的宏函数和内联函数,探讨了它们的优缺点,以及const和define在定义常量时的不同。宏函数以空间换时间,但存在缺陷;内联函数提供更好的类型检查,但编译器可能不进行内联。const和define在编译阶段和预处理阶段有所不同,const占用内存,define则为运行时操作。
摘要由CSDN通过智能技术生成

目录

1. 宏函数define和内联函数inline

1.1 宏函数

1.1.1 宏函数缺陷1:

1.1.2 宏函数缺陷2:

1.2 内联函数

1.2.1 类外内联函数

1.2.2 类内内联函数

1.2.3 一些情况编译器可能不会进行内联编译

2. const和define的区别


1. 宏函数define和内联函数inline

1.1 宏函数

语法:define

以空间换时间。宏可以避免函数频繁调用所产生的开销,由预处理完成。

1.1.1 宏函数缺陷1:

如果不写括号,会导致结果与预期不符

#define MYADD(a,b) a+b

int main()
{
    int c = MYADD(1,2)*10;    //c = 21
}
1.1.2 宏函数缺陷2:

即使写括号,也可能会导致结果与预期不符

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

int main()
{
    int a = 10;
    int b = 20;
    int ret = MYCOMPARE(++a, b);    //(((++a) < (b)) ? (++a) : (b))
    
    cout<<ret<<endl;    //12
}

1.2 内联函数

由于C++中,预处理器不能访问类中元素。所以如果函数是一个成员函数,则不能定义为宏函数。

内联函数本身也是一个真正的函数,具有普通函数的所有行为。而且在适当的地方也会像定义宏一样展开,所以不需要函数调用的开销。

1.2.1 类外内联函数

语法:

  • 分文件编写时,则函数声明和定义前面都要加inline
  • 否则,函数定义和声明函数结合在一起时,前面加inline

否则作为普通函数来对待。

inline int myCompare(int a, int b)
{
    return a < b ? a : b;
}
1.2.2 类内内联函数

类内部的成员函数自动就是内联函数(隐藏加了inline关键字)。

1.2.3 一些情况编译器可能不会进行内联编译
  • 不能存在循环语句
  • 不能存在过多的条件判断语句
  • 函数体不能过于庞大
  • 不能对函数进行取址操作

但是,一些不写inline声明的函数,但是简单/小,编译器也可能把他作为内联编译。

2. const和define的区别

const用于定义常量,define用于定义宏,而宏也可以用于定义常量。

都用于定义常量时,区别:

  • const⽣效于编译的阶段;define⽣效于预处理阶段。
  • const定义的常量,在C语⾔中是存储在内存中、需要额外的内存空间的;define定义的常量,运⾏时是直接的操作数,并不会存放在内存中。
  • const定义的常量是带类型的;define定义的常量不带类型。因此define定义的常量不利于类型检查。

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值