【C++】宏函数和内联函数的区别

宏优点

  • 代码复用性
  • 提高性能

宏缺点

  • 不可调试(预编译阶段进行了替换),
  • 无类型安全检查
  • 可读性差,容易出错。

这里附上《c和指针》中的一张表格,总结宏和函数十分到位,我就不多说了
在这里插入图片描述
#define定义一个比如判断大小,替换常量,很是方便。

不过现在也就用下,#define ERROR_POWEROFF -1,#define _CRT_SECURE_NO_WARNINGS 1这样的和编译器有关的东西,不会去写宏函数,宏函数这东西,可读性特别差,在c++中,一般用const/枚举/内联去替代宏。

但是,define宏在某些方面真的是非常好用
1.替代路径

#define ENG_PATH_1 C:\Program Files (x86)

2.针对编译器版本不兼容报错

#define _CRT_SECURE_NO_WARNINGS 1

3.条件编译

#ifdef 标识符
程序段 1
#else
程序段 2
#endif

4.使用库中的宏
vc++中有许多有意思的宏,都是大牛们写出来的,真的是充满智慧,十分刁钻,怎么学也学不完,我个人担心出错就很少写宏,用函数代替了

宏函数和inline函数的区别

inline函数是C++引入的机制,目的是解决使用宏定义的一些缺点。

内联函数与宏定义区别

(1)内联函数在编译时展开,宏在预编译时展开;

(2)内联函数直接嵌入到目标代码中,宏是简单的做文本替换;

(3)内联函数有类型检测、语法判断等功能,宏没有;

(4)inline函数是函数,宏不是;

(5)宏定义时要注意书写(参数要括起来)否则容易出现歧义,内联函数不会产生歧义;

为什么要引入内联函数?

用内联函数替代宏定义,消除宏定义的缺点:

宏定义使用预处理器实现,做一些简单的字符替换,因此不能进行参数有效性的检测。
宏定义的返回值不能被强制转换为可转换的合适类型。
C++中引入了类及类的访问控制,在涉及到类的保护成员和私有成员就不能用宏定义来操作。

inline相比宏定义有哪些优越性

(1)inline函数代码是被放到符号表中,使用时像宏一样展开,没有调用的开销,效率很高;

(2)inline函数是真正的函数,所以要进行一系列的数据类型检查;

(3)inline函数作为类的成员函数,可以使用类的保护成员及私有成员;

inline函数使用的场合

(1)使用宏定义的地方都可以使用inline函数;

(2)作为类成员接口函数来读写类的私有成员或者保护成员;

为什么不能把所有的函数写成inline函数?

内联函数以代码复杂为代价,它以省去函数调用的开销来提高执行效率。
一方面如果内联函数体内代码执行时间相比函数调用开销较大没有太大的意义;
另一方面每一处内联函数的调用都要复制代码,消耗更多的内存空间,因此以下情况不宜使用内联函数:

(1)函数体内的代码比较长,将导致内存消耗代价;

(2)函数体内有循环,函数执行时间要比函数调用开销大;

猜你喜欢

转载自blog.csdn.net/Vcrossover/article/details/112604264