宏函数与普通函数的比较
来源:互联网 发布:个人房源采集软件 编辑:程序博客网 时间:2024/06/16 05:29
一. 计算机里的宏
一般来说,所谓宏,就是将一些命令组织在一起,作为一个单独命令完成一个特定的任务。
在计算机科学中,宏是一种抽象的规则模式,或称为语法替换。根据一系列预定义的规则进行字符串的替换。
二. 宏定义
1、宏定义是C程序提供的预处理功能之一。宏函数由编译器在编译预处理过程中进行处理,称做宏展开。
2、宏定义包括带参数的宏定义和不带参数的宏定义。具体是指用一个指定的标志符来进行简单的字符串替换
或者进行阐述替换。
(1)不带参数的宏替换
# define 标识符 字符串
例 # define NAME "zhangyunlong"
(2)带参数的宏定义
# define 标识符(参数列表) 字符串
带参的宏函数的定义中允许包含多行指令。当有多行指令时,在每一行指令的末尾要求加上" \ "符号,且该
符号后面不能加其他任何符号,
(包括空格),否则将会出现错误。
例 # define S(a,b) a*b // 在宏定义的末尾不需要加分号
# define swap(x, y) \
x = x + y; \
y = x - y;
三. 使用宏函数的注意事项
(1)宏名一般采用大写字母
(2)宏定义末尾不加分号
(3)宏定义不分配内存
(4)宏与类型无关。宏定义中没有数据类型。
(5)带参数的宏定义中需要注意参数为表达式的情况。合理添加括号。
例 # define S(r) r*r
area=S(a+b);
第一步换为 area=r*r;
第二步被换为 area=a+b*a+b; 运算符的结合顺序发生变化,结果错误。
故正确的宏定义是 # define S(r) ((r)*(r))
(6)宏的使用会增加源程序的代码量。
(7)宏的执行在编译过程中,占编译时间,不占运行时间。
四. 宏函数和普通函数的区别
在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成普通函数,也可以封装成
宏定义函数。那么究竟是用函数好,还是宏定义好?这就要求我们对二者理解和分析,合理取舍。
利用一个简单函数辅助理解
宏定义函数:
# define max(a,b) (a > b) ? a : b
普通函数:
int max ( int a , int b)
{
int max;
max=(a>b)?a:b ;
}
显然,在这两种形式的函数中我们会选择宏定义函数来解决问题。原因有两个:
一,普通函数的调用会带来额外的开销。它需要在内存空间中开辟一个栈空间,来记录函数调用过程中的所有数据。
这种开销不仅会增加代码量,而且会降低程序的执行效率。而宏定义则没有这步操作。所以考虑代码规模和执行
速度,我们选用宏定义。
二,普通函数的参数必须被声明为特定的类型,所以它只能在类型合适的表达式上使用。如果输入的是两个整型的数
据,则该函数将无法执行。而对于宏函数来说,宏与类型无关,宏函数的展开在程序的预编译过程中,不进行语
法检查,故使用宏函数时,没有数据类型的限制。
当然,宏函数也有其无法避免的缺点。在普通函数中,编译一个语句会生成其相对应的一个或多个汇编语言;而在宏
函数下,这个宏定义本身倒不必编译生成指令,但是代码中出现的每次调用编译生成的指令都相当于一个函数体,而
不是简单的几条传参指令和call指令。所以,使用宏定义编译生成的目标文件会比较大。
- 宏函数与普通函数的比较
- 构造函数与普通函数的比较
- 宏函数与普通函数的区别
- 宏函数与普通函数的区别
- 比较函数式宏定义和普通函数的区别
- 对内联函数与普通函数的一些比较与分析:
- 对内联函数与普通函数的一些比较与分析
- 内联函数与宏、普通函数的区别
- 函数式宏定义与普通函数的区别
- 宏、内联函数与普通函数的区别
- 深入探讨:宏、内联函数与普通函数的区别
- 宏定义函数与普通函数的区别
- 仿函数与普通函数的区别
- inline函数与普通函数的区别
- 构造函数与普通函数的区别
- 构造函数与普通函数的区别
- 构造函数与普通函数的区别
- 函数模板与普通函数的区别
- leetcode 209.Minimum Size Subarray Sum 如何优化来减少时间
- 6.2—排序—Merge Two Sorted Lists
- synchronized
- 总师组的工作模式和方法
- 6.3—排序—Merge k Sorted Lists
- 宏函数与普通函数的比较
- 自定义类型在Set容器里
- [leetcode]138. Copy List with Random Pointer@Java解题报告
- 6.4—排序—Insertion Sort List
- 安卓开发由一个APP拉起另一个APP的方法总结
- webrtc 服务器搭建
- 6.5—排序—Sort List
- 微信开发2
- Kali linux 2016.2(Rolling)里安装OpenVAS