宏函数与普通函数的比较

来源:互联网 发布:个人房源采集软件 编辑:程序博客网 时间:2024/06/16 03:15

一. 计算机里的宏

     一般来说,所谓宏,就是将一些命令组织在一起,作为一个单独命令完成一个特定的任务。

     在计算机科学中,宏是一种抽象的规则模式,或称为语法替换。根据一系列预定义的规则进行字符串的替换。

二. 宏定义

1、宏定义是C程序提供的预处理功能之一。宏函数由编译器在编译预处理过程中进行处理,称做宏展开。

2、宏定义包括带参数的宏定义和不带参数的宏定义。具体是指用一个指定的标志符来进行简单的字符串替换

     或者进行阐述替换。

(1)不带参数的宏替换

         # define  标识符  字符串

         例  # define  NAME  "zhangyunlong"

(2)带参数的宏定义

          # define  标识符(参数列表) 字符串

         带参的宏函数的定义中允许包含多行指令。当有多行指令时,在每一行指令的末尾要求加上" \ "符号,且该

         符号后面不能加其他任何符号,

         (包括空格),否则将会出现错误。

         例  # define  S(a,b)  a*b   // 在宏定义的末尾不需要加分号

               # define swap(x, y) \

                  x = x + y; \

                  y = x - y; 

三. 使用宏函数的注意事项

(1)宏名一般采用大写字母

(2)宏定义末尾不加分号

(3)宏定义不分配内存

(4)宏与类型无关。宏定义中没有数据类型。

(5)带参数的宏定义中需要注意参数为表达式的情况。合理添加括号。

         例  # define S(r)  r*r

              area=S(a+b);

              第一步换为 area=r*r; 

              第二步被换为 area=a+b*a+b; 运算符的结合顺序发生变化,结果错误。

              故正确的宏定义是 # define S(r) ((r)*(r))

(6)宏的使用会增加源程序的代码量。

(7)宏的执行在编译过程中,占编译时间,不占运行时间。

四. 宏函数和普通函数的区别

     在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成普通函数,也可以封装成

     宏定义函数。那么究竟是用函数好,还是宏定义好?这就要求我们对二者理解和分析,合理取舍。

     利用一个简单函数辅助理解

     宏定义函数:

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

     普通函数:

     int max ( int a , int b)

     {

          int max;

          max=(a>b)?a:b ;

     }

     显然,在这两种形式的函数中我们会选择宏定义函数来解决问题。原因有两个:

     一,普通函数的调用会带来额外的开销。它需要在内存空间中开辟一个栈空间,来记录函数调用过程中的所有数据。

            这种开销不仅会增加代码量,而且会降低程序的执行效率。而宏定义则没有这步操作。所以考虑代码规模和执行

            速度,我们选用宏定义。

     二,普通函数的参数必须被声明为特定的类型,所以它只能在类型合适的表达式上使用。如果输入的是两个整型的数

            据,则该函数将无法执行。而对于宏函数来说,宏与类型无关,宏函数的展开在程序的预编译过程中,不进行语

            法检查,故使用宏函数时,没有数据类型的限制。

      当然,宏函数也有其无法避免的缺点。在普通函数中,编译一个语句会生成其相对应的一个或多个汇编语言;而在宏

      函数下,这个宏定义本身倒不必编译生成指令,但是代码中出现的每次调用编译生成的指令都相当于一个函数体,而

      不是简单的几条传参指令和call指令。所以,使用宏定义编译生成的目标文件会比较大。



        




  

        

        

        


    


原创粉丝点击