好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

C语言中宏定义的用法与意义(20页).doc

20页
  • 卖家[上传人]:ss****gk
  • 文档编号:277857852
  • 上传时间:2022-04-15
  • 文档格式:DOC
  • 文档大小:148.50KB
  • / 20 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • C语言宏定义技巧(常用宏定义)写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等下面列举一些成熟软件中常用得宏定义OOOOOO1防止一个头文件被重复包含#ifndefOCM»FHttdefineFH/戻文件内容推 ndifZ重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植olean value type */typedefuns i gnedlongintuint32/* Unsigned 32 bit value */typedefunsignedshortuintl^/*Ums igned16 bitvalue*/typedefunsignedchar/* Unsigned 8 bit value */typedefsignedlong intint32/*Signed32 bitvalue */typedefsigned shortintl@* Signed16 bit value *//* Signed 8 bit value *///T面的不建议使用typedef uns i gned char bytQ* Unsigned 8 bit value type */typedef uns i gned short word* Lhsinged 16 bit value type */typedef uns i gned long dwor(i* Unsigned 32 bit value type */typedef unsigned charuintl;Unsigned 16 bit value type */typedef uns i gned longuint4* Umsigned 32 bit value type */typedef signed char inti;/* Signed 8 bit value type */typedef signed short int^/* Signed 16 bit value type */typedef long int int4sint31;/* Signed 32 bit value type */typedef signed long* Signed 32 bit value */sintl^sintT;typedef signed short* Signed 16 bit value */ typedef signed char/* Signed 8 bit value */3得到指定地址上的一个字节或字ttdefine MB4 B( x )(*((byte 为®)))define NBSW( x )^ord 対 ))(Cd > 3) ?(Cd V S) ? (x)求最大值和最小値^define M^X( x y ):(y))^define MIN(耳 y ):(y))5得到一个field在结构体(struct)中的偏移量ttdefine FPOS ( typg field ) \/*lint —e545 */ ( 0word) &(( type 必 0)-> field)/*1 int -+e545 */&得到一个结构体中field所占用的字节数ttdefine FSIZ( type field ) sizeof ( ((type 为 0)-> field )Z按照ISB格式把两个字节转化为一个W)rdttdefine FLIFW( ray ) ( ((^ord) (ray) [0]) * 25©+ (ray) [1])8按照ISB格式把一个WDrd转化为两个字节ttdefine FLQFW( Fay val ) \(ray) [0]((val) / 256); \9得到一个变量的地址(word宽度)ttdefine BPIR( var ) ( (byte 刈(void&&ar))#define W PIR( var ) ( @ord 为(void&&ar))1ft得到一个字的高位和低位字节#def ine WWJBCxxk) ((byte) (®ord)(XXX)255))ttdefine W5RDHI (xx>d ((byte) (^ord)(XXX)U返回一个比X大的最接近的8的倍数用efine RO8 ( x )((((x) + 7) / 8 )12将一个字母转换为大写ttdefine UFCASE( c ) ( ((c) >= ' a' 8& @) f£) ? ((c)-0x20)(c))U判断字符是不是10进值的数字define EKOK( c ) ((c) K ' G <&& (c) V= P)14判断字符是不是16进值的数字ttdefineHEXOK(9D ll\((c) K 7 A&& (c) <= ZF) ||\((c) K 雪 <8& (c) <= 7 f))15防止溢出的一个方法拥efine INC S^T( val )(yal((yal)4-l > &al))? (va 1)44 : (val))1G返回数组元素的个数沖define ARR SIZE( a )(sizeof ( (a) ) / sizeof ( (a[Oj)))13返回_个无符号数nM的值沁理四陀死郭0区用efine M® Hf PCWGR 仿 TW ( val, irud by ) \((Sword) &al) & ^word) (fnod^by)18对于I曲间映射在存储空间的结构,输入输出处理ttdefine inp (port)刃 ^port)))^((volatile byte#def ine inpwQ)ort)&(Volatile word为 ^port)))#def ine inpdw (jport)&((Volatile dword刈(port)))#define outp (port val)&((Volatile byte 为(port)) = ((byte) &al)))#def ine outpw^)ort val)快(&olatile word 为快((volatile dword 为(jport)) = (^vord) &al)))#define outpdw (por^ val)(jport)) = (^dword) &al)))12005-9-9 添加]19使用一些宏跟踪调试ANS I标准说明了五个预定义的宏名。

      它们是:LINEDATETIME如果编译不是标准的,则可能仅支持以上宏名中的几个,或根本不支持记住编译程序也许还提供其它预定义的宏名— LINE公—FILE建指令在有关# line的部分中已讨论,这里讨论其余的宏名 D AT E建指令含有形式为月/H徉的串,表示源文件被翻译到代码时的日期源代码翻译到目标代码的时间作为串包含在—T I M E 与串 形式为时:分:秒如果实现是标准的,则宏—s T D C占有十进制常量L如果它含有任何其它数,则实现是非标准的可以定义宏,町如:当定义了』TO 输出数据信息和所在文件所在行#ifdef#defineIKS::LQvHjfnsg date)printf teg); printf 沁%1”,date LINE、 FILE )#else#def ineLQvBSfnsg date)#endif2Q宏定义防止使用是错误用小括号包含例如:^define ⑥ (鈕)用do Awhile (0)语句包含多语句防止错误例如:«difne DO (a b) 出 \a-Hr应用时:if (-.)DO@b); /沪生错误else解决方法:#difne DO(a b) do{a+h \宏中粧和“掰啲用法般用法我们使用舱宏参数变为一个字符串,用井耙两个宏参数贴合在一起.用法:#include #includeusing namespace stgttdefine SIR®#sdefine CUSB(a b)int (a##teOb)int mainO//输出字符printf SIR (veld);串 nvcknprintf C%1n, GCNS(2 3)); // 2e3 输出:2000return Q}二、当宏参数是另一个宏的时候需要注意的是凡宏定义里有用或'掰的地方宏参数是不会再展开.1非和‘卅的情况拥 efine 1CW (2)ttdefine MUL(a b) (a*b) printf: TOV TOY NO. 00^™); 这行的宏会被展开为:printfn, (2), (2), ((2)*(2)));MUL里的参数只邓会被展开为(2).Z当有或'曲的时候#sint拥 efine SIR(s) define GCKB (a b) printf Cint max %s: SmONn^X)); // INTM« #include这行会被展开为:printf Cint max %sn, 磁);printf (%n, OCNSa A); // caipileerror这一行则是:printf (%n, int (AeA));INIM和A都不会再被展开,然而解决这个问题的方法很简 单.加多一层中间转换宏.加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换 宏里的那一个宏就能得到正确的宏参数.ttdefine A用efine _Sm(s) ttdefine STR(s) 转换宏^define _OCNS (a b)^define CJCNS @ b)#sSIR(s)int WeWOCNS(a b)////转换宏printf Cint max%sn, SmONT^X));// INTM« int 型的最大值,为一个变量#include输出为:int maxOx7fffffffSIRdNTMVO —>_SIR(0x7ffffffD然后再转换成字符串;printf C%1n, oassa A);输出为:200A)。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.