C语言函数与宏怎么使用
导读:本文共2337字符,通常情况下阅读需要8分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 一、函数与宏宏是由预处理器直接替换展开的,编译器不知道宏的存在函数是由编译器直接编译的实体,调用行为由编译器决定多次使用宏会导致最终可执行程序的体积增大函数是跳转执行的,内存中只有一份函数体存在宏的效率比函数要高,因为是直接展开,无调用开销函数调用时会创建活动记录,效率不如宏下面看一个函数与宏的示例,先看这个程序:#include<stdio.h>... ...
目录
(为您整理了一些要点),点击可以直达。一、函数与宏
宏是由预处理器直接替换展开的,编译器不知道宏的存在
函数是由编译器直接编译的实体,调用行为由编译器决定
多次使用宏会导致最终可执行程序的体积增大
函数是跳转执行的,内存中只有一份函数体存在
宏的效率比函数要高,因为是直接展开,无调用开销
函数调用时会创建活动记录,效率不如宏
下面看一个函数与宏的示例,先看这个程序:
#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;}
输出结果如下:
但是如果我们这么写,RESET(6, len); 程序直接出现段错误,都没有给出警告:
而我们使用函数reset(6, len); 时,则会出现警告:
所以说能用函数实现的功能就尽可能的不使用宏。
宏的效率比函数稍高,但是其副作用巨大
宏是文本替换,参数无法进行类型检查
可以用函数完成的功能绝对不用宏
宏的定义中不能出现递归定义
下面看一个宏的副作用的代码:
#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;}
输出结果如下:
按理说输出结果应该是 21 和 1 ,为什么是 11 和 2 呢?下面进行单步调试,输入gcc -E test.c -o test.i,得到 test.i 文件,部分结果如下:
这样就能解释了。
二、宏的妙用
用于生成一些常规性的代码
封装函数,加上类型信息
下面看一个宏的妙用的示例:
#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;}
输出结果如下:
输入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语言函数与宏怎么使用的详细内容,希望对您有所帮助,信息来源于网络。