zoukankan      html  css  js  c++  java
  • 【转】C语言中DEFINE简介及多行宏定义

       【转】C语言中DEFINE简介及多行宏定义
    要写好C语言,漂亮的宏定义是非常重要的。宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。   在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定义。那么究竟是用函数好,还是宏定义好?这就要求我们对二者进行合理的取舍。   我们来看一个例子,比较两个数或者表达式大小,首先我们把它写成宏定义:   
    #define MAX( a, b) ( (a) > (b) (a) : (b) )   其次,把它用函数来实现:   int max( int a, int b)   {   return (a > b a : b)   }   很显然,我们不会选择用函数来完成这个任务,原因有两个:首先,函数调用会带来额外的开销,它需要开辟一片栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆栈。这种开销不仅会降低代码效率,而且代码量也会大大增加,而使用宏定义则在代码规模和速度方面都比函数更胜一筹;其次,函数的参数必须被声明为一种特定的类型,所以它只能在类型合适的表达式上使用,我们如果要比较两个浮点型的大小,就不得不再写一个专门针对浮点型的比较函数。反之,上面的那个宏定义可以用于整形、长整形、单浮点型、双浮点型以及其他任何可以用“>”操作符比较值大小的类型,也就是说,宏是与类型无关的。   和使用函数相比,使用宏的不利之处在于每次使用宏时,一份宏定义代码的拷贝都会插入到程序中。除非宏非常短,否则使用宏会大幅度增加程序的长度。   还有一些任务根本无法用函数实现,但是用宏定义却很好实现。比如参数类型没法作为参数传递给函数,但是可以把参数类型传递给带参的宏。   看下面的例子:   #define MALLOC(n, type)   ( (type *) malloc((n)* sizeof(type)))   利用这个宏,我们就可以为任何类型分配一段我们指定的空间大小,并返回指向这段空间的指针。我们可以观察一下这个宏确切的工作过程:   int *ptr;   ptr = MALLOC ( 5, int );   将这宏展开以后的结果:   ptr = (int *) malloc ( (5) * sizeof(int) );   这个例子是宏定义的经典应用之一,完成了函数不能完成的功能,但是宏定义也不能滥用,通常,如果相同的代码需要出现在程序的几个地方,更好的方法是把它实现为一个函数。   下面总结和宏和函数的不同之处,以供大家写代码时使用,这段总结摘自《C和指针》一书。 【转】C语言中DEFINE简介及多行宏定义 EXample define的单行定义 #define maxi(a,b) (a>;b?a:b) define的多行定义 define可以替代多行的代码,例如MFC中的宏定义(非常的经典,虽然让人看了恶心) #define MACRO(arg1, arg2) do { stmt1; stmt2; } while(0) 关键是要在每一个换行的时候加上一个 " " //宏定义写出swap(x,y)交换函数 #define swap(x, y) x = x + y; y = x - y; x = x - y;
  • 相关阅读:
    无限维
    黎曼流形
    why we need virtual key word
    TOJ 4119 Split Equally
    TOJ 4003 Next Permutation
    TOJ 4002 Palindrome Generator
    TOJ 2749 Absent Substrings
    TOJ 2641 Gene
    TOJ 2861 Octal Fractions
    TOJ 4394 Rebuild Road
  • 原文地址:https://www.cnblogs.com/bytebee/p/8205546.html
Copyright © 2011-2022 走看看