先说宏和函数的区别:

1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型.
2. 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的.
3. 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间.
4. 宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的参数传递则是具体变量之间的信息传递,形参作为函数的局部变量,显然是占用内存的.
5. 函数的调用是需要付出一定的时空开销的,因为系统在调用函数时,要保留现场,然后转入被调用函数去执行,调用完,再返回主调函数,此时再恢复现场,这些操作,显然在宏中是没有的.

现在来看内联函数:

所谓"内联函数"就是将很简单的函数"内嵌"到调用他的程序代码中,只样做的目的是为了避免上面说到的第5点,目的旨在节约下原本函数调用时的时空开销.但必须注意的是:作为内联函数,函数体必须十分简单,不能含有循环、条件、选择等复杂的结构,否则就不能做为内联函数了。事实上,即便你没有指定函数为内联函数,有的编译系统也会自动将很简单的函数作为内联函数处理;而对于复杂的函数,即便你指定他为内联函数,系统也不会理会的。

函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一些CPU时间。

而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏函数的时候,该现象尤其突出。

1. 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间.
这句分开解释:
"" 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,""
解释:假设代码中有这么一条宏定义:#define MAX_LEN 10(10是宏体, MAX_LEN 是宏名)则在编译之前, 也就是在预编译的时候会将代码中所有出现MAX_LEN的地方替换成10后在进行下面的代码编译, 这种替换工作实在编译之前进行的..."" 而函数显然是编译之后,在执行时,才调用的""
解释: 函数调用实在执行时才调用的这是显然的, 因为只有执行时才能根据具体的条件决定调用哪个函数""因此,宏占用的是编译的时间,而函数占用的是执行时的时间. ""
解释:有了上面的解释,估计这句话也就知道了, 从他的这句话看书的作者把预编译也算作编译的一部分了...2.宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的参数传递则是具体变量之间的信息传递,形参作为函数的局部变量,显然是占用内存的.
同样分开解释:"" 宏的参数是不占内存空间的,因为只是做字符串的替换""
解释:假设有这么个宏定义#define MAX(a, b) (a) > (b) ? (a) : (b) 代码中所有出现(初定义外)MAX(a, b)的地方在预编译以后都变成了 (a) > (b) ? (a) : (b)这个式子, 比如代码中有c = MAX(1, 3)这样的语句, 则在预编译的时候就会变成c = (1) > (3) ? (1) : (3), 这是一种直接的替换, 不会产生中间变量, 所以也就不用为之分配空间 ..."而函数调用时的参数传递则是具体变量之间的信息传递,形参作为函数的局部变量,显然是占用内存的."
解释: 函数调用时需要为每个形式参数在栈上分配空间, 然后将实参的值拷贝进去, 在函数的内部用的都是这个形参, 当函数结束后形参的空间会被自动释放掉, 这也是为什么形参的改变无法改变实参的值的原因...
================================================== 宏:                                                  内联函数: 1.由预处理器处理                             1.编译器处理 2.对++/--操作有副作用                        2.可能会被编译器拒绝(不一定内联) 3.难于调试                                   3.可能造成代码膨胀 4.必定被展开==================================================

转载于:https://blog.51cto.com/iynu17/1707499

宏、函数、宏和函数的区别相关推荐

  1. C语言中的带参宏和带参函数的区别

    C语言中的带参宏和带参函数的区别 (1) 带参函数中的形参是变量,因此有类型检查.而带参宏只是简单的字符串替换. (2) 从程序执行的过程来看,带参宏是在预处理阶段被预处理器处理的.而带参函数是在程序 ...

  2. 宏定义函数与普通函数的区别

    目录 前言 1 宏定义函数与普通函数不同 1.1 编译过程上不同 1.2 执行过程上不同 2 批判分析 3 内联函数 前言 可以在前面的系列文章中看到,FreeRTOS 的 头文件中定义了大量的宏定义 ...

  3. 函数式宏定义与普通函数的区别?C语言宏定义和宏定义函数 ?

    http://www.jb51.net/article/41869.htm 尽管函数式宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧.传参.传返回 ...

  4. 【C语言】宏和函数形式的函数的区别

    定义一个加法函数为例: 一.定义宏 #define ADD(x,y) ((x)+(y)) 其中ADD是宏名:(x,y) 是宏的参数,无类型: ((x)+(y)) 是宏体 宏的本质是进行替换 二.定义函 ...

  5. 宏函数与普通函数的区别

    我们由问题展开: 1.什么是宏函数? 2.宏函数与普通函数的相同点?不同点? 3.宏函数与普通函数的优缺点? 什么是宏函数? 在这之前看一下宏的定义: 宏 宏是根据一系列预定义的规则替换一定的文本模式 ...

  6. 宏函数和自定义函数的区别

    首先举一个比较两个数或者表达式大小的例子. 我们把它写成宏定义函数: #define MAX( a, b) ( (a) > (b) (a) : (b) ) 其次,把它用自定义函数来实现: int ...

  7. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  8. C++中宏与内联函数

    1宏定义 C++是C的超集,C++继承了C的一个重要特性就是效率,在C中提高程序运行效率的重要手段就是宏,宏可以不用普通函数的调用但使用起来就像普通函数调用一样,宏的实现采用的是预处理器而不是编译器, ...

  9. JavaScript异步编程【上】 -- 同步和异步、事件循环(EventLoop)、微任务和宏任务、回调函数

    文章内容输出来源:拉勾教育 大前端高薪训练营 前言 在我们学习JavaScript中,我们知道,JavaScript的执行环境是单线程的.所谓单线程是指一次只能完成一个任务,如果有多个任务,就必须排队 ...

  10. 【C/C++】inline函数和static函数和宏定义的比较

    inline内联函数 1.内联函数的定义:内联函数是指用inline关键字修饰的函数.如果内联函数在类体内定义,不用inline关键字声明,默认为内联函数. 2.内联函数在函数调用点展开,没有栈帧的开 ...

最新文章

  1. BahdanauAttention与LuongAttention注意力机制简介
  2. 在django中使用django_debug_toolbar
  3. VMWare 环境下devstack创建虚拟机报错及修改nova-api返回数据得条目
  4. [你必须知道的.NET]第二十三回:品味细节,深入.NET的类型构造器
  5. 开源运维管理软件排名_车主无忧:为什么放弃开源Kafka?
  6. 厦门大学c语言第七八章作业答案,厦门大学 运筹学 第七、八章作业
  7. 敏捷开发一千零一问系列之十八:长期受制于强势客户怎么办?(下)
  8. mysql缺失值处理方法,插值MySQL表中的缺失值
  9. 计算机代数与数论pdf,计算机代数与数论.pdf
  10. CSDN账号,你需要不
  11. Win7连接蓝牙耳机(千月蓝牙激活码分享)无需破解软件
  12. 通过VC编程实现基于LAN的PC机与Tektronix示波器通信
  13. outlook哪个版本好用
  14. 语音信号处理基础知识之频谱、相位谱、幅度谱、功率谱及语谱图
  15. 施密特正交化过程编程c语言,利用C程序编写格拉姆-施密特正交化的过程..docx
  16. 7个技巧帮助你进行更有吸引力的脉动/脉搏调查
  17. kb3020369不适用计算机,适用于Windows 7的Service Pack 2 Microsoft发布KB3020369便利汇总更新 | MOS86...
  18. LeetCode 1646. 获取生成数组中的最大值 Python
  19. HDU 6595. Everything Is Generated In Equal Probability (期望+逆元)
  20. Kafka之四:Kafka与Streaming集成

热门文章

  1. SSH如何通过公钥连接云服务器
  2. .NET异步编程总结----四种实现模式
  3. cmd移动文件到另一个文件夹_Java 如何获得一个文件或文件夹的大小
  4. python web开发框架 支持windows_基于Python的Web开发框架研究_曾浩
  5. linux 神奇命令,Linux 命令神器:lsof 入门
  6. python 标准库 excel_Python 操作 Excel 的函数库
  7. BCrypt加密怎么存入数据库_松哥手把手带你入门 Spring Security,别再问密码怎么解密了...
  8. ocienvcreate php 失败_win7 homebasic下,.net2008 连接oracle,提示错误OCIEnvCreate
  9. u8虚拟服务器端口,用友u8服务器参数配置
  10. for循环在c++中的用法_C ++中的循环