精华内容
下载资源
问答
  • 要写好C语言,漂亮的宏定义是非常重要的。宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。
  •     要写好C语言,漂亮的宏定义是非常重要的。宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。  在软件开发过程中,经常有一些常用或者通用的功能或者代...

        要写好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;

    自己写的一个小例子: 

    // 不能加 * 应为 指针 也是一种类型

    #define  SORT( a,  n)\

    {\

        int i, j;\

        int *t = MALLOC(1,int);\

        for(i=0; i<n-1; i++)\

        {\

            for(j=0; j<n-1-i; j++)\

            {\

                if(*(a+j) > *(a+j+1))\

                {\

                    *t = *(a+j);\

                    *(a+j) = *(a+j+1);\

                    *(a+j+1) = *t;\

                }\

            }\

        }\

    }


    int main(int argc, const char * argv[])

    {

        int a=10, b= 120;


        int data[]={3,200,5};

        //swap(&a, &b);

        

       // sort(data, 3);     //和队列一样:会依据专题的(shi can)参数 自动识别类型

        

        SORT(data, 3);     //会主动用实参 代替 形参 识别类型

        

        for(int i=0;i<3;i++)

        cout << data[i]  << endl;

        

        

        //printf("%d   %d", a, b);

        return 0;

    }


    展开全文
  • c语言宏定义函数如何调用

    千次阅读 2015-09-22 10:20:24
    同样道理,这个宏定义的外层括号也是不能省的。若函数中是宏替换为 ++MAX(a,b),则宏展开就成了 ++(a)>(b)?(a):(b),运算优先级也是错了。  (3)宏函数往往会导致较低的代码执行效率。  int a[]={9,3,5,...

     直接调用即可。如下示例:

    #include<stdio.h>
    #define sum(b,c){int d=0;d=b+c;printf("两者的和:%d\n",d);}
    int main()
    {
        int x=0,y=0;
        scanf("%d%d",&x,&y);
        sum (x,y);
        return 0;
    }
     
    测试通过:
    #include<stdio.h>
    #include<stdlib.h>
    #define sum(b,c){int d=0;d=b+c;printf("两者的和:%d\n",d);}
    int main()
    {
        int x=0,y=0;
        scanf("%d%d",&x,&y);
        sum (x,y);
    	system("pause");
        return 0;
    }
    测试代码2:通过
     
    #include <stdio.h>
    #include <stdlib.h>
    #define transit(a, b, c, type) {  type t=a;a=b;b=c;c=t;}
    int main()
    {
    	int a=1;
    	int b=2;
    	int c=3;
    	printf("a=%d, b=%d, c=%d\n", a, b, c);
    	transit(a, b, c, int);
    	printf("a=%d, b=%d, c=%d\n", a, b ,c);
    	system("pause");
    	return 1;
    }



      使用宏函数或者宏函数时,注意如下几点:

      (1)宏函数的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以传参时要格外小心。

      (2)宏函数定义要注意格式,尤其是括号。

      如果上面的宏函数写成 #define MAX(a, b) (a>b?a:b),省去内层括号,则宏展开就成了k = (i&0x0f>j&0x0f?i&0x0f:j&0x0f),运算的优先级就错了。同样道理,这个宏定义的外层括号也是不能省的。若函数中是宏替换为 ++MAX(a,b),则宏展开就成了 ++(a)>(b)?(a):(b),运算优先级也是错了。

      (3)宏函数往往会导致较低的代码执行效率。

     int a[]={9,3,5,2,1,0,8,7,6,4};
      int max(n)
      {
      return n==0?a[0]:MAX(a[n],max(n-1));
      }
      int main()
      {
      max(9);
      return 0;
      }

        若是普通函数,则通过递归,可取的最大值,时间复杂度为O(n)。但若是宏函数,则宏展开为( a[n]>max(n-1)?a[n]:max(n-1) ),其中max(n-1)被调用了两遍,这样依此递归下去,时间复杂度会很高。





    展开全文
  • C语言宏定义函数

    万次阅读 多人点赞 2019-03-18 11:40:46
    通过一个比较函数的例子来说明宏函数和普通函数的区别: 宏函数形式: #define MAX( a, b) ( (a) &gt; (b) (a) : (b) ) //这里为什么有这么多括号,后面会讲 普通函数形式: int max(int a, int b) { ...

    通过一个比较函数的例子来说明宏函数和普通函数的区别:

    宏函数形式:

    #define MAX( a, b) ( (a) > (b) (a) : (b) ) //这里为什么有这么多括号,后面会讲

    普通函数形式:

    int max(int a, int b)
    {
         return (a > b a : b)
    }

    宏函数

    优点:节省空间(给形参节省)

    缺点:浪费时间(主要浪费在编译时);没有语法检查,不安全。

    普通函数

    优点:有语法检查

    缺点:浪费空间。


    注意宏函数在调用时只是对函数中的变量做简单的替换,注意这里的替换真的是替换,非常死板的那种!!!

    可以看一下下面的例子:

    #define SQUARE_SUM(x,y) x*x+y*y
    #include <stdio.h>
    
    int main()
    {
        int i = 1,j = 2,k ;
        k = SQUARE_SUM(i+1,j);
        printf("%d",k);
        return 0;
    }

    很多人可能会这样算:2*2+2*2=8,这样其实是错误的。

    看一下程序运行的结果:

    原因是程序只是做了替换,也就是1+1*1+1+2*2=7

    现在知道为什么要在宏函数定义时加这么多括号了吧 (= =)

    想达到结果为8的效果应该这样写:

    #define SQUARE_SUM(x,y) (x)*(x)+(y)*(y) //注意这里的括号!!
    #include <stdio.h>
    
    int main()
    {
        int i = 1,j = 2,k ;
        k = SQUARE_SUM(i+1,j);
        printf("%d",k);
        return 0;
    }

    运行结果:

    OK! 大功告成!

    展开全文
  • C语言宏定义函数

    2017-06-03 10:56:18
     这个例子是宏定义的经典应用之一,完成了函数不能完成的功能,但是宏定义也不能滥用,通常,如果相同的代码需要出现在程序的几个地方,更好的方法是把它实现为一个函数。  zigbee里多行define...

    转载于http://blog.sina.com.cn/s/blog_861912cd0100tc94.html


        在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定义。那么究竟是用函数好,还是宏定义好?这就要求我们对二者进行合理的取舍。

        我们来看一个例子,比较两个数或者表达式大小,首先我们把它写成宏定义:

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

        其次,把它用函数来实现:

    int max( int a, int b)
        {
            return (a > b a : b)
        }

        很显然,我们不会选择用函数来完成这个任务,原因有两个:

       (1)首先,函数调用会带来额外的开销,它需要开辟一片栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆栈。这种开销不仅会降低代码效率,而且代码量也会大大增加,而使用宏定义则在代码规模和速度方面都比函数更胜一筹;

       (2)其次,函数的参数必须被声明为一种特定的类型,所以它只能在类型合适的表达式上使用,我们如果要比较两个浮点型的大小,就不得不再写一个专门针对浮点型的比较函数。反之,上面的那个宏定义可以用于整形、长整形、单浮点型、双浮点型以及其他任何可以用“>”操作符比较值大小的类型,也就是说,宏是与类型无关的。


       

        和使用函数相比,使用宏的不利之处在于每次使用宏时,一份宏定义代码的拷贝都会插入到程序中。除非宏非常短,否则使用宏会大幅度增加程序的长度。还有一些任务根本无法用函数实现,但是用宏定义却很好实现。比如参数类型没法作为参数传递给函数,但是可以把参数类型传递给带参的宏。

        看下面的例子:

    #define MALLOC(n, type) \
    ( (type *) malloc((n)* sizeof(type)))

        利用这个宏,我们就可以为任何类型分配一段我们指定的空间大小,并返回指向这段空间的指针。我们可以观察一下这个宏确切的工作过程。

    int *ptr;
      ptr = MALLOC ( 5, int );
      //将这宏展开以后的结果:
      ptr = (int *) malloc ( (5) * sizeof(int) );
        这个例子是宏定义的经典应用之一,完成了函数不能完成的功能,但是宏定义也不能滥用,通常,如果相同的代码需要出现在程序的几个地方,更好的方法是把它实现为一个函数。



        zigbee里多行define有如下例子

    #define FillAndSendTxOptions( TRANSSEQ, ADDR, ID, LEN, TxO ) { \
    afStatus_t stat;                                    \
    ZDP_TxOptions = (TxO);                              \
    stat = fillAndSend( (TRANSSEQ), (ADDR), (ID), (LEN) );          \
    ZDP_TxOptions = AF_TX_OPTIONS_NONE;                 \
    return stat;                                        \
    }


    展开全文
  • C语言宏定义、宏函数、内置宏与常用宏

    万次阅读 多人点赞 2018-09-30 17:48:43
    C语言(C++)特有的两把双刃剑指针和宏定义/宏函数使得C语言在底层开发中披荆斩棘、无所不能。这两个概念涉及范围比较广,其分支点也比较多,可谓星罗棋布,但这每颗星都足以照亮C语言因其开发周期、可维护性、可...
  • C语言宏定义用法大全

    2018-06-11 22:12:36
    关于C语言宏定义的用法,作了一个总结,除了常用宏定义外,还有类似函数的宏的用法
  • 再谈C语言宏定义

    千次阅读 2020-05-17 23:47:56
    再谈C语言宏定义 文章目录再谈C语言宏定义简单的宏定义带参数宏定义宏定义中的#和##运算符#运算符##运算符删除宏定义常用预定义宏 简单的宏定义 简单宏定义格式 [关键字] [标识符] [替换列表] 关键字 #define ...
  • 今天小编就为大家分享一篇C语言#define拼接宏定义实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • C语言_宏定义

    万次阅读 多人点赞 2019-02-02 00:20:03
      编译一个C语言程序的第一步骤就是预处理阶段,这一阶段就是发挥作用的阶段。C预处理器在源代码编译之前对其进行一些文本性质的操作,主要任务包括删除注释、插入被#include进来的文件内容、定义和替换由#...
  • C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数。下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include #include char *strlong(char *str1, char *str2){...
  • C语言中宏定义技巧.doc
  • c语言宏函数怎么传递宏参数We can define a function like Macro, in which we can pass the arguments. When a Macro is called, the Macro body expands or we can say Macro Call replaces with Macro Body. ...
  • 尽管函数宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧、传参、传返回值等一系列工作,因此那些简短并且被频繁调用的函数经常用函数宏定义来代替实现...
  • C语言 返回值

    千次阅读 2018-07-25 16:48:24
    宏函数(块结构表达式) 可以代替一段函数,而且有返回值。 #include &amp;amp;lt;stdio.h&amp;amp;gt; #define kaddr(addr)\ ({\ int tmp = addr;\ if (addr &amp;amp;gt; 5) \ tmp = 2;\ else\ ...
  • C语言位操作宏定义函数

    万次阅读 2021-06-18 15:48:54
    我们在写C语言时,经常需要用到位操作,但是每次自己使用逻辑运算符进行操作的时候,很费脑子,试试下面几个宏定义吧: #define GET_BIT(value,bit) ((value)&(1<<(bit))) //读取指定位 #define CPL_BIT...
  • C语言宏定义和几个坑

    千次阅读 2017-08-16 14:11:49
    总结一下C语言中宏的一些特殊用法和几个容易踩的坑。由于本文主要参考GCC文档,某些细节(如参数中的空格是否处理之类)在别的编译器可能有细微差别,请参考相应文档。 基础 仅仅是在C预处理阶段的一种...
  • C语言宏定义讲解

    千次阅读 多人点赞 2019-04-28 21:13:17
    详细讲解了C语言的两大宏定义
  • RT-Thread Studio编译器里使用宏定义计算如下公式 按照正常的数学运算关系,算出来的结果是453.59 如果不加括号算出来的值完全不对,结果是 -1050360954.1510059952 把计算过程全都加上括号后计算正确 ...
  • 宏定义在编译阶段被纯文本替换,因此使用宏定义函数时要特别注意优先级问题。 #include<iostream> using namespace std; #define DIV(x) x/x int main(){ int a = 12, k = 3, m = 1; a /= DIV(k + m) / ...
  • 详解C语言中的#define宏定义命令用法简单讲解C语言中宏的定义与使用如何在C语言的宏中使用类型关键字C语言中的内联函数(inline)与宏定义(#define)详细解析C语言中宏定义使用的小细节C语言宏定义使用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 90,823
精华内容 36,329
关键字:

c语言宏定义函数

c语言 订阅