函数式宏定义和普通函数的区别

转载 2016年08月29日 16:22:47

在C及C++语言中允许用一个标识符来表示一个字符串,称为宏,该字符串可以是常数、表达式、格式串等。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。若字符串是表达式,我们称之为函数式宏定义。
我们以下面两行代码为例,展开描述:
函数式宏定义:#define MAX(a,b) ((a)>(b)?(a):(b))
普通函数 :MAX(a,b) { return a>b?a:b;}

(1)函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以传参时要格外小心。

(2)函数式宏定义要注意格式,尤其是括号

这个宏定义的外层括号也是不能省的。若函数中是宏替换为 ++MAX(a,b),则宏展开就成了 ++(a)>(b)?(a):(b),运算优先级也是错了。同理,内存括号也不要省。

(3)若函数参数为表达式,则普通函数的调用与函数式宏定义的替换过程是不一样的。

普通函数调用时先求实参表达式的值再传给形参,如果实参表达式有Side Effect,那么这些SideEffect只发生一次。例如MAX(++a, ++b),如果MAX是普通函数,a和b只增加一次。但如果MAX函数式宏定义,则要展开成k = ((++a)>(++b)?(++a):(++b)),a和b就不一定是增加一次还是两次了。所以若参数是表达式,替换函数式宏定义时一定要仔细看好。

(4)调用真正函数的代码和调用函数式宏定义的代码编译生成的指令不同。
如果MAX是个普通函数,那么它的函数体return a > b ? a : b; 要编译生成指令,代码中出现的每次调用也要编译生成传参指令和call指令。而如果MAX是个函数式宏定义,这个宏定义本身倒不必编译生成指令,但是代码中出现的每次调用编译生成的指令都相当于一个函数体,而不是简单的几条传参指令和call指令。所以,使用函数式宏定义编译生成的目标文件会比较大。

宏函数与自定义函数的区别(面试总结)

在c语言中,函数式宏定义和自定义函数的区别是什么? 自定义函数: 宏函数 (1)函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以危险性高;但因为...
  • xinianbuxiu
  • xinianbuxiu
  • 2016年07月29日 15:39
  • 2920

宏、函数、宏函数的区别

http://hi.baidu.com/pobenliu/blog/item/3e458208279486a32fddd43f.html 宏、函数、宏函数的区别 先说宏和函...
  • u011559491
  • u011559491
  • 2015年07月15日 10:47
  • 1975

宏的本质以及宏(包括函数式宏) 没有返回值概念

一、 #define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本: #define      这里说的 指的是源代码文件(级别)...
  • haiross
  • haiross
  • 2015年06月12日 15:23
  • 5768

宏、函数、宏函数的区别

http://hi.baidu.com/pobenliu/blog/item/3e458208279486a32fddd43f.html 宏、函数、宏函数的区别 先说宏和函数的区别: ...
  • lanbing598235681
  • lanbing598235681
  • 2012年02月19日 13:32
  • 13167

宏和函数的区别

属性 #define宏 函数 代码长度 每次使用,宏代码都被插入到程序中。除了非常小的宏之外,程序的长度将大幅度增长 函数代码只出现于同一个地方;每次使用这个函数时,都调用那...
  • z517602658
  • z517602658
  • 2016年11月04日 20:28
  • 520

C语言宏定义和宏定义函数

要写好C语言,漂亮的宏定义是非常重要的。宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。   在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成...
  • bytxl
  • bytxl
  • 2015年05月26日 14:51
  • 8740

c++ 宏函数定义 例子 vs2012

  • 2015年07月23日 09:53
  • 403KB
  • 下载

C语言宏定义函数的使用(定义单行和多行)

要写好C语言,漂亮的宏定义是非常重要的。宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。   在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成...
  • u013321328
  • u013321328
  • 2014年02月25日 21:17
  • 10000

c语言宏定义函数如何调用

直接调用即可。如下示例: #include #define sum(b,c){int d=0;d=b+c;printf("两者的和:%d\n",d);} int main() {     int x...
  • qqyuanhao163
  • qqyuanhao163
  • 2015年09月22日 10:20
  • 818

C_语法_宏定义define和函数的作用…

要写好C语言,漂亮的宏定义是非常重要的。宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为...
  • u012575899
  • u012575899
  • 2014年04月09日 10:37
  • 2144
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:函数式宏定义和普通函数的区别
举报原因:
原因补充:

(最多只允许输入30个字)