C语言函数与宏怎么使用(c语言,开发技术)

时间:2024-05-06 03:13:51 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

一、函数与宏

  • 宏是由预处理器直接替换展开的,编译器不知道宏的存在

  • 函数是由编译器直接编译的实体,调用行为由编译器决定

  • 多次使用宏会导致最终可执行程序的体积增大

  • 函数是跳转执行的,内存中只有一份函数体存在

  • 宏的效率比函数要高,因为是直接展开,无调用开销

  • 函数调用时会创建活动记录,效率不如宏

下面看一个函数与宏的示例,先看这个程序:

#include<stdio.h>#defineRESET(p,len)\while(len>0)\((char*)p)[--len]=0voidreset(void*p,intlen){while(len>0)((char*)p)[--len]=0;}intmain(){intarray[]={1,2,3,4,5};intlen=sizeof(array);inti=0;RESET(array,len);for(i=0;i<5;i++){printf("array[%d]=%d\n",i,array[i]);}return0;}

输出结果如下:

C语言函数与宏怎么使用

但是如果我们这么写,RESET(6, len); 程序直接出现段错误,都没有给出警告:

C语言函数与宏怎么使用

而我们使用函数reset(6, len); 时,则会出现警告:

C语言函数与宏怎么使用

所以说能用函数实现的功能就尽可能的不使用宏。

  • 宏的效率比函数稍高,但是其副作用巨大

  • 宏是文本替换,参数无法进行类型检查

  • 可以用函数完成的功能绝对不用宏

  • 宏的定义中不能出现递归定义

下面看一个宏的副作用的代码:

#include<stdio.h>#define_ADD_(a,b)a+b#define_MUL_(a,b)a*b#define_MIN_(a,b)((a)<(b)?(a):(b))intmain(){inti=1;intj=10;printf("%d\n",_MUL_(_ADD_(1,2),_ADD_(3,4)));printf("%d\n",_MIN_(i++,j));return0;}

输出结果如下:

C语言函数与宏怎么使用

按理说输出结果应该是 21 和 1 ,为什么是 11 和 2 呢?下面进行单步调试,输入gcc -E test.c -o test.i,得到 test.i 文件,部分结果如下:

C语言函数与宏怎么使用

这样就能解释了。

二、宏的妙用

  • 用于生成一些常规性的代码

  • 封装函数,加上类型信息

下面看一个宏的妙用的示例:

#include<stdio.h>#include<malloc.h>#defineMALLOC(type,x)(type*)malloc(sizeof(type)*x)#defineFREE(p)(free(p),p=NULL)#defineLOG_INT(i)printf("%s=%d\n",#i,i)#defineLOG_CHAR(c)printf("%s=%c\n",#c,c)#defineLOG_FLOAT(f)printf("%s=%f\n",#f,f)#defineLOG_POINTER(p)printf("%s=%p\n",#p,p)#defineLOG_STRING(s)printf("%s=%s\n",#s,s)#defineFOREACH(i,n)while(1){inti=0,l=n;for(i=0;i<l;i++)#defineBEGIN{#defineEND}break;}intmain(){int*pi=MALLOC(int,5);char*str="AutumnZe";LOG_STRING(str);LOG_POINTER(pi);FOREACH(k,5)BEGINpi[k]=k+1;ENDFOREACH(n,5)BEGINintvalue=pi[n];LOG_INT(value);ENDFREE(pi);LOG_POINTER(pi);return0;}

输出结果如下:

C语言函数与宏怎么使用

输入gcc -E test.c -o test.i,看看中间文件 test.i,就能理解这段宏的巧妙之处。

intmain(){int*pi=(int*)malloc(sizeof(int)*5);char*str="AutumnZe";printf("%s=%s\n","str",str);printf("%s=%p\n","pi",pi);while(1){intk=0,l=5;for(k=0;k<l;k++){pi[k]=k+1;}break;}while(1){intn=0,l=5;for(n=0;n<l;n++){intvalue=pi[n];printf("%s=%d\n","value",value);}break;}(free(pi),pi=((void*)0));printf("%s=%p\n","pi",pi);return0;}
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:C语言函数与宏怎么使用的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:golang gorm开发架构及怎么写插件下一篇:

13 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18