資源描述:
《c語(yǔ)言常用宏定義技巧》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、C語(yǔ)言常用宏定義技巧C語(yǔ)言常用宏定義技巧2推薦C語(yǔ)言常用宏定義技巧用C語(yǔ)言編程,宏定義是個(gè)很重要的編程技巧。用好了宏定義,它可以增強(qiáng)程序的可讀性、可移植性、方便性、靈活性等等。1.防止一個(gè)頭文件被重復(fù)包含:#ifndefCOMDEF_H#defineCOMDEF_H//頭文件內(nèi)容#endif當(dāng)你所建的工程有多個(gè)源文件組成時(shí),很可能會(huì)在多個(gè)文件里頭包含了同一個(gè)頭文件,如果借用上面的宏定義就能夠避免同一個(gè)頭文件被重復(fù)包含時(shí)進(jìn)行多次編譯。因?yàn)楫?dāng)它編譯第一個(gè)頭文件時(shí)總是沒有定義#defineCOMDEF_H,那么它將編譯一遍頭文件中所有的內(nèi)容,包括定義#defineCO
2、MDEF_H。這樣編譯再往下進(jìn)行時(shí)如果遇到同樣要編譯的頭文件,那么由于語(yǔ)句#ifndefCOMDEF_H的存在它將不再重復(fù)的編譯這個(gè)頭文件。2.通過宏定義使得同一數(shù)據(jù)類型的字節(jié)數(shù)不因不同的平臺(tái)或不同的編譯器而改變:typedefunsignedcharboolean;/*Booleanvaluetype*/typedefunsignedlongintuint32;/*Unsigned32bitvalue*/typedefunsignedshortuint16;/*Unsigned16bitvalue*/typedefunsignedcharuint8;/*Uns
3、igned8bitvalue*/typedefsignedlongintint32;/*Signed32bitvalue*/typedefsignedshortint16;/*Signed16bitvalue*/typedefsignedcharint8;/*Signed8bitvalue*/3.得到指定地址的一個(gè)字節(jié)或字:#defineMEM_B(x)(*((uint8*)(x)))#defineMEM_W(x)(*((uint16*)(x)))注:類似于這種有多個(gè)字符串組成的宏定義一定要注意加上“()”,因?yàn)槲覀冎篮甓x只是一種簡(jiǎn)單的字符替換功能。4.求最
4、大值和最小值:#defineMAX(x,y)(((x)>(y))?(x):(y))#defineMAX(x,y)(((x)<(y))?(x):(y))5.得到一個(gè)結(jié)構(gòu)體中field所占用的字節(jié)數(shù):#defineFSIZ(type,field)sizeof(((type*)0)->field)6.按照LSB格式把兩個(gè)字節(jié)轉(zhuǎn)化為一個(gè)Word:#defineFLIPW(ray)((((word)(ray)[0])*256)+(ray)[1])或可以是#defineFLIPW(data1,data2)((((word)(data1))*256)+(data2))7.按照
5、LSB格式把一個(gè)Word轉(zhuǎn)化為兩個(gè)字節(jié):#defineFLOPW(ray,val)do{(ray)[0]=((val)/256);(ray)[1]=((val)&0xFF);}while(0)或可以是#defineFLOPW(data1,data2,val)do{data1=((val)/256);data2=((val)&0xFF);}while(0)注:這里的do{}while(0)是為了防止多語(yǔ)句的宏定義在使用中出錯(cuò)。比如:if(…)FLOPW(ray,val)else上面的程序代碼中要是宏定義FLOPW(ray,val)中沒有do{}while(0),這
6、時(shí)我們應(yīng)該將語(yǔ)句改為:if(…){FLOPW(ray,val)}else{}8.得到一個(gè)變量的地址:#defineB_PTR(var)((byte*)(void*)&(var))#defineW_PTR(var)((word*)(void*)&(var))注:宏定義語(yǔ)句中void*申明了該地址可以是任何類型變量的地址,byte*申明為單字節(jié)變量的地址,word*申明為雙字節(jié)變量的地址。9.得到一個(gè)高位和低位字節(jié):#defineWORD_LO(xxx)((byte)((word)(xxx)&0xFF))#defineWORD_HI(xxx)((byte)((wor
7、d)(xxx)>>8))10.返回一個(gè)比X大的最接近的8的倍數(shù):#defineRND8(x)((((x)+7)/8)*8)11.將一個(gè)字母轉(zhuǎn)換為大寫:#defineUPCASE(c)(((c)>=‘a(chǎn)’&&(c)<=‘z’)?((c)–0x20):(c))相對(duì)應(yīng)的還有將一個(gè)字母轉(zhuǎn)換為小寫:#defineUPCASE(c)(((c)>=‘A’&&(c)<=‘Z’)?((c)+0x20):(c))注:如果你記不住大寫和小寫之間的ASCII差值,可以將0x20換成(’a’-‘A’),但這里小寫的ASCII值大于大寫的ASCII值你該要記住的吧。12.防止溢出的一個(gè)方法
8、:#defineINC_