【面试简答题(详谈)】宏与函数的区别

原创 2016年05月30日 17:14:15

      首先,推荐大家一本书《C与指针》,第14章讲宏讲的非常的详细。

       如:

wKioL1YwzbGQhUWZAALxESQvi_A534.jpg

 

 

宏可以非常频繁地用于执行简单的计算,比如在两个表达式中寻找其中较大(或较小)的一个:

#define MAX( a, b )     ( (a) > (b) ? (a) : (b) )

为什么不用函数来完成这个任务呢?有两个原因:

     1.用于调用和从函数返回的代码很可能比实际执行这个小型计算工作的代码更大,

所以使用宏比使用函数在程序的规模和速度更胜一筹。

     2.但是更重要的是,函数的参数必须申明为一种特定的类型,所以它只能在类型合适的表达式上使用。

反之,上面的宏可以用于整形、长整形、单浮点型、双浮点型以及其他任何可以使用>操作符比较值大小的类型。

换句话说:

     宏是类型无关的。


     和函数相比,使用宏的不利之处在于每次使用宏时,一份宏定义代码的拷贝将插入到程序中,除非宏非常短,否则使用宏可能会大幅度增加程序的长度。

     还有一些任务根本无法使用函数实现。让我们仔细观察下面的代码:

     #define MALLOC( n,    type)      \

       ( ( type *) malloc ( (n) * sizeof( type ) ) )


        int *pi = MALLOC( 25, int );


这个宏的第二个参数是一种类型,它无法作为函数参数进行传递。

这个宏替换完成之后:

int *pi = ( ( int *) malloc ( (25) * sizeof( int ) ) );

 

 

带副作用的宏参数

     当宏参数在宏定义中出现次数超过一次时,如果这个参数具有副作用,那么当你使用这个宏时就可能出现危险,导致不可预料的结果。副作用就是在表达式求值时出现的永久性效果。例如,下面表达式

   x + 1;

可以执行几百次,他每次获得结果都是一样的,这个表达式不具有副作用。但是

  x ++;    

就有副作用:它增加x的值。当这个表达式下一次执行时,他将产生一个不同的结果。MAX宏可以证明具有副作用的参数所引起的问题。

#define MAX( a, b )  ( (a) > ( b) ? (a ) : (b) )

        int x = 5;

        int y = 8;

        int z = MAX( x++, y++);

        printf("x = %d, y = %d, z = %d\n" , x, y, z );


spacer.gif

这里较小的值计算了一次,但是较大的值却计算了两次。


副作用并不仅限于修改变量的值,getchar()也会产生副作用。调用这个函数将”消耗“输入的一个字符。

 

#define 宏的行为和真正的函数相比存在一些不同的地方。spacer.gif



由于有了这些不同之处,所以让程序员知道一个标识符究竟是一个宏还是一个函数式非常重要的。不幸的是,使用宏的语法和使用函数的语法是完全一样的,所以语言本身并不能区分这个两者。

wKiom1YwzomjDC9yAAJJ-xm-45Y689.jpg

C++中宏和函数的区别

宏和函数写法以及调用方式,有很大的相似,但是他们却存在本质上的区别,函数调用时将实参表达式值求出来,然后赋值给形参,计算结果,而宏则是对实参表达式不做计算,直接替换。 eg: int fun(int ...
  • hsd2012
  • hsd2012
  • 2016年01月11日 20:45
  • 658

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

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

C语言类函数宏和一般函数的区别

类函数宏:用#define使用参数来定义宏,宏的参数用圆括号
  • RHEL_admin
  • RHEL_admin
  • 2014年09月09日 21:54
  • 1182

C++中宏定义和内联函数区别

1. 宏代码不是函数
  • cgl1079743846
  • cgl1079743846
  • 2014年05月27日 00:45
  • 2422

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

函数式宏定义与普通函数的区别尽管函数式宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧、传参、传返回值等一系列工作,因此那些简短并且被频繁调用的函数...
  • isongbo
  • isongbo
  • 2015年07月04日 21:57
  • 1949

含参数的宏与函数的区别

?         宏替换不占运行时间,只占编译时间;而函数调用则占运行时间(分配单元、保留现场、值传递、返回),所以每次执行都要载入所以执行起来比较慢一些。。 ?         定义宏的时候...
  • u011775691
  • u011775691
  • 2014年03月14日 18:10
  • 748

数据结构简答题

jiandat 1.简述数据的逻辑结构和存储结构的区别与联系,它们如何影响算法的设计与实现? 答:若用结点表示某个数据元素,则结点与结点之间的逻辑关系就称为数据的逻辑结构。数据在计算机中的存储表示...
  • zhouboyu
  • zhouboyu
  • 2014年08月31日 22:37
  • 1911

百度面试题:宏的概念,与函数的区别,优缺点的比较

宏 宏概念: C++ 宏定义将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替。 宏书写形式: #define () 宏与函数的区别: 时间上考虑: 1...
  • niepangu
  • niepangu
  • 2016年04月07日 18:51
  • 432

UE4中蓝图宏的使用

宏在UE4中的作用可为十分重要,我们经常都会用到,下面我为大家讲述一下宏的使用吧1.新建一个宏,命名为AddCount,分别为Input和Output添加参数,如下: 2.添加float+f...
  • leemu0822
  • leemu0822
  • 2016年10月14日 15:58
  • 1127

比较带参宏与函数的异同

编译器是在程序的预编译阶段对宏进行处理的,主要是用预编译指令来替换源文件中的宏。 1.宏会在编译器在对源代码进行编译的时候进行简单替换,不会进行任何逻辑检测,即简单代码复制而已。2.宏进行定义时不会考...
  • piaojun_pj
  • piaojun_pj
  • 2010年10月11日 09:41
  • 1569
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【面试简答题(详谈)】宏与函数的区别
举报原因:
原因补充:

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