【摘要】:从形式上看,带参数的宏调用和函数调用没有什么区别,而且确实在一些情况下它们产生同样的结果。例如:程序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语言语法的检查,更不管程序的意思,只是机械地按照宏定义把宏调用替换为对应的字符串。
在程序中为什么要使用带参数的宏呢?理由是使用宏比函数调用更快。因为宏在真正编译之前已被相应地替换,在执行时,不必打断调用程序的运行,也没有参数的传递。而使用函数调用,当执行到有函数调用的语句时,主调函数要把参数传给被调函数,同时把控制权转给被调函数,被调函数运行完后再返回主调函数,这些都需要许多时间上的额外开销。当这种调用很频繁时(如在一个循环次数很多的循环体中),程序执行的速度就比较慢了。
相关推荐