首页 理论教育宏与函数的区别及性能优势

宏与函数的区别及性能优势

【摘要】:从形式上看,带参数的宏调用和函数调用没有什么区别,而且确实在一些情况下它们产生同样的结果。例如:程序1:这两个程序的主函数main()是完全一样的,调用宏和调用函数得到相同的运行结果,都是5。理由是使用宏比函数调用更快。因为宏在真正编译之前已被相应地替换,在执行时,不必打断调用程序的运行,也没有参数的传递。

从形式上看,带参数的宏调用和函数调用没有什么区别,而且确实在一些情况下它们产生同样的结果。例如:

程序1:

这两个程序的主函数main()是完全一样的,调用宏和调用函数得到相同的运行结果,都是5。但这种情况并不总是成立的。例如:

程序1:

运行的结果为:

1

9

25

这是怎么回事?为什么会出现不同的结果呢?还是让我们来看看预处理时替换的结果。

square(i++)(www.chuimin.cn)

被替换为

(i++)*(i++)

这样一来我们就知道为什么会出现这种结果了。

1=1*1随后i自增两次,i=3

9=3*3随后i自增两次,i=5

25=5*5随后i自增两次,i=7

3次循环后,i值为7超过了5,循环也就结束了。

关于宏定义需要说明的是:C语言预处理程序并不做任何C语言语法的检查,更不管程序的意思,只是机械地按照宏定义把宏调用替换为对应的字符串。

在程序中为什么要使用带参数的宏呢?理由是使用宏比函数调用更快。因为宏在真正编译之前已被相应地替换,在执行时,不必打断调用程序的运行,也没有参数的传递。而使用函数调用,当执行到有函数调用的语句时,主调函数要把参数传给被调函数,同时把控制权转给被调函数,被调函数运行完后再返回主调函数,这些都需要许多时间上的额外开销。当这种调用很频繁时(如在一个循环次数很多的循环体中),程序执行的速度就比较慢了。