C语言宏定义技巧和实现动态数组_第1页
C语言宏定义技巧和实现动态数组_第2页
C语言宏定义技巧和实现动态数组_第3页
C语言宏定义技巧和实现动态数组_第4页
C语言宏定义技巧和实现动态数组_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、写好C语言,漂亮的宏定义很重耍,使用宏定义可以防止岀错,提高可移植性,可读性,方便性等等。下而列举一些成熟软件中常用得宏定义仁防止一个头文件被重复包含#ifndefCOMDEF.H#defineCOMDEF_H头文件内容#endif重新定义些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。typedefunsignedcharboolean;/*Booleanvaluetype.*/typedefunsignedlongintuint32;/*Unsigned32bitvalue*/typedefunsignedshortuintl6;/*Unsigned16bitva

2、lue*/typedefunsignedcharuint8;/*Unsigned8bitvalue*/typedefsignedlongintint32;/*Signed32bitvalue*/typedefsignedshortintl6;/*Signed16bitvalue*/typedefsignedcharint8;/*Signed8bitvalue*/下而的不建议使用typedefunsignedcharbyte;/*Unsigned8bitvaluetype.*/typedefunsignedshortword;/*Unsinged16bitvaluetype.*/typedefu

3、nsignedlongdword;/*Unsigned32bitvaluetype.*/typedefunsignedcharuintl;/*Unsigned8bitvaluetype.*/typedefunsignedshortuint2;/*Unsigned16bitvaluetype.*/typedefunsignedlonguint4;/*Unsigned32bitvaluetype.*/typedefsignedcharinti;/*Signed8bitvaluetype.*/typedefsignedshortint2;/*Signed16bitvaluetype.*/typede

4、flongintint4;/*Signed32bitvaluetype.*/typedefsignedlongsint31;/*Signed32bitvalue*/typedefsignedshortsintl5;/*Signed16bitvalue*/typedefsignedcharsint7;/*Signed8bitvalue*/得到指定地址上的一个字节或字#defineMEM_B(x)(*(byte*)(x)#defineMEM_W(x)(*(word*)(x)求最人值和最小值#defineMAX(x,y)(x)(y)?(x):(y)#defineMIN(x,y)(x)field)/*

5、lint+e545*/得到一-个结构体中field所占用的字节数#defineFSIZ(type,field)sizeof(type*)0)-field)按照LSB格式把两个字节转化为一个Word#defineFLIPW(ray)(word)(ray)0)*256)+(ray)l)&按照LSB格式把一个Word转化为两个字节#defineFLOPW(ray,val)(ray)0=(val)/256);(ray)l=(val)&OxFF)得到一个变量的地址(wod宽度)#defineB_PTR(var)(byte*)(void*)&(var)#defineW_PTR(var)(word*)(vo

6、id*)&(var)得到一个字的高位和低位字节#defineWORD_LO(xxx)(byte)(word)(xxx)&255)#defineWORD_HI(xxx)(byte)(word)(xxx)8)返回一个比X大的最接近的8的倍数#defineRND8(x)(x)+刀/8)*8)将一个字母转换为人写#defineUPCASE(c)(c)=Q&(c)=O&(c)=*0*&(c)=w&(C)=a&(c)(val)?(val)+l:(val)返回数组元素的个数#defineARR_SIZE(a)(sizeof(a)/sizeof(a0)返回个无符号数n尾的值MOD_BY_POWER_OF_TW

7、O(X,n)=X%(2F)#defineMOD_BY_POWER_OF_TWO(val,mod_by)(dword)(val)&(dword)(mod_by)-l)对于IO空间映射在存储空间的结构,输入输出处理#defineinp(port)(*(volatilebyte*)(port)#defineinpw(port)(*(volatileword*)(port)#defineinpdw(port)(*(volatiledword*)(port)#defineoutp(port,val)(*(volatilebyte*)(port)=(byte)(val)#defineoutpw(port,

8、val)(*(volatileword*)(port)=(word)(val)#defineoutpdw(port,val)(*(volatiledword*)(port)=(dword)(val)2005-9-9添加19,使用一些宏跟踪调试ANSI标准说明了五个预定义的宏名。它们是:LINE_FILE_DATE_TIME_STDC_如果编译不是标准的,则可能仅支持以上宏名中的儿个,或根本不支持。记住编译程序也许还提供其它预定义的宏名。_LINE-及_FILE_宏指令在有关#Iine的部分中已讨论,这里讨论其余的宏名。.DATE_宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。

9、源代码翻译到目标代码的时间作为串包含在_TIME_中。串形式为时:分:秒。如果实现是标准的,则宏_STDC_含有十进制常量1。如果它含有任何其它数,则实现是非标准的。可以定义宏,例如:当定义了_DEBUG,输出数据信息和所在文件所在行#ifdef.DEBUG#defineDEBUGMSG(msg,date)printf(msg);printff%d%d%ddater_LINE_/_FILE_)#else#defineDEBUGMSG(msg,date)#endif20,宏定义防止使用是错误用小括号包含。例如:#defineADD(a,b)(a+b)用dowhile(0)语句包含多语句防止错误例

10、如:#difneDO(azb)a+b;a+;应用时:if(-.)DO(a,b);产生错误else解决方法:#difneDO(a,b)doa+b;a+;while(O)宏中”#和”#的用法一、一-般用法我们使用#把宏参数变为一个字符串,用#把明个宏参数贴合在一起.用法:#include#includeusingnamespacestd;#defineSTR#s#defineCONS(a,b)int(a#e#b)intmain()printf(STR(vck);/输出字符串”vckprintf(,%dn,zCONS(2,3);/2e3输111:2000return0;二、当宏参数是另一个宏的时候需

11、要注意的是凡宏定义里有用#或#的地方宏参数是不会再展开.非#和#的情况#defineTOW(2)#defineMUL(azb)(a*b)printf(,%d*%d=%dn,zTOgTOMUL(TOWTOW);这行的宏会被展开为:pnntf(%d*%d=%dn;(2),(2),(2)*(2);MUL里的参数TOW会被展开为(2).当有或#的时候#defineA(2)#defineSTR#s#defineCONS(a,b)int(a#e#b)printf(Mintmax:%snzSTR(INT_MAX);INT_MAX#include这行会被展开为:printf(Mintmax:%sn,/HINT

12、_MAXn);/compileerrorprintf(,%sn,/CONS(A,A);/compileerror这一行则是:printf(,%sn,/int(AeA);INT_MAX和A都不会再被展开,然而解决这个问题的方法很简单.加多一层中间转换宏.加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数#defineA#define_STR(s)#defineSTR(s)#s#defineA#define_STR(s)#defineSTR(s)#s_STR#define_CONS(azb)int(a#e#b)#defineCONS(a,b)_

13、CONS(a,b)/转换宏/转换宏printf(Hintmax:%sn,/STR(INT_MAX);/INT_MAX,int型的最人值,为一个变量#include输岀为:intmax:0 x7fffffffSTR(INT_MAX)-_STR(0 x7fffffff)然后再转换成字符典pintfr%dn:CONS(A,A);输出为:200CONS(A,A)-_CONS(2),(2)int(2)e(2)三、申和#的一些应用特例1、合并匿名变量名#defineANONYMOUSl(type,var;line)typeva#line#define_ANONYMOUSO(type,line)ANONYM

14、OUSl(type,.anonymous,line)#defineANONYMOUS(type)_ANONYMOUSO(type,_LINE_)例:ANONYMOUS(staticint);即:staticint_anonymous70;70表示该行行号;第一层:ANONYMOUS(staticint);-_ANONYMOUSO(staticint,_LINE_);第二层:ANONYMOUSl(staticint,anonymous,70);第三层:staticint_anonymous70;即每次只能解开当前层的宏,所以_LINE_在第二层才能被解开:2、填充结构#defineFILL(a)

15、a,#aenumIDDOPENZCLOSE;typedefstructMSGIDDid;constchar*msg;MSG;MSG_msg=FILL(OPEN),FILL(CLOSE);相当于:MSG_msg=OPEN,“OPEN)CLOSE,“CLOSE”;3、记录文件名#define_GET_FILE_NAME(f)#f#defineGET_FILE_NAME(f)_GET_FILE_NAME(f)staticcharFILE_NAME=GET_FILE_NAME(_FILE_);4、得到一个数值类型所対应的字符串缓冲人小#define_!YPE_BUF_SIZE(type)sizeof#

16、type#defineTYPE_BUF_SIZE(type)YPE_BUF_SIZE(type)charbuf7YPE_BUF_SIZE(INT_MAX);-charbuf_TYPE_BUF_SIZE(0 x7fffffff);-charbufsizeof这里相当于:charbufll;c语言实现动态数组test.h#ifndefTEST.H#defineTEST.HtemplateclassArrayprivate:T*parray;introom;定义动态数组存储空间人小的值public:Array():room(0),parray(NULL)parray=(int*)malloc(siz

17、eof(int)*room);Array()if(parray!=NULL)free(parray);intpush_back(Tm)推入一个数组元素room+;parray=(T*)realloc(parrayzsizeof(T)*room);*(parray+room-l)=m;return*(parray+room-l);intsizeof_Array()得到数组人小returnroom;boolremove(intk)删除第k个元素printfC1删除元素4后”,k);if(kroom-l11kroom|kroom-l11k0)return-1;elsereturn*(parray+k

18、);voiddisplayO显示数组内元素个数for(inti=0;iroom;i+)coutquery(i)endl;cout数组内元素个数sizeof_Array()endl;T*begin()returnparray;T*end()returnparray+room;#endiftest.cpp#include#include,test.hnusingnamespacestd;voidmain()ArrayintArray;intArray.push_back(1);intArray.push_back(2);intArray.push_back(3);intArray.push_back(4);intArray.push_back(5);intArray.push_back(6);intArray.push_back(7);intAr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论