目录
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定义的常量不利于类型检查。