
C语言中宏定义的用法与意义(20页).doc
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





![河南新冠肺炎文件-豫建科[2020]63号+豫建科〔2019〕282号](http://img.jinchutou.com/static_www/Images/s.gif)






