C語言宏定義技巧和實現(xiàn)動態(tài)數(shù)組_第1頁
C語言宏定義技巧和實現(xiàn)動態(tài)數(shù)組_第2頁
C語言宏定義技巧和實現(xiàn)動態(tài)數(shù)組_第3頁
C語言宏定義技巧和實現(xiàn)動態(tài)數(shù)組_第4頁
C語言宏定義技巧和實現(xiàn)動態(tài)數(shù)組_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、寫好C語言,漂亮的宏定義很重耍,使用宏定義可以防止岀錯,提高可移植性,可讀性,方便性等等。下而列舉一些成熟軟件中常用得宏定義仁防止一個頭文件被重復(fù)包含#ifndefCOMDEF.H#defineCOMDEF_H頭文件內(nèi)容#endif重新定義些類型,防止由于各種平臺和編譯器的不同,而產(chǎn)生的類型字節(jié)數(shù)差異,方便移植。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*/得到指定地址上的一個字節(jié)或字#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*/得到一-個結(jié)構(gòu)體中field所占用的字節(jié)數(shù)#defineFSIZ(type,field)sizeof(type*)0)-field)按照LSB格式把兩個字節(jié)轉(zhuǎn)化為一個Word#defineFLIPW(ray)(word)(ray)0)*256)+(ray)l)&按照LSB格式把一個Word轉(zhuǎn)化為兩個字節(jié)#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)得到一個字的高位和低位字節(jié)#defineWORD_LO(xxx)(byte)(word)(xxx)&255)#defineWORD_HI(xxx)(byte)(word)(xxx)8)返回一個比X大的最接近的8的倍數(shù)#defineRND8(x)(x)+刀/8)*8)將一個字母轉(zhuǎn)換為人寫#defineUPCASE(c)(c)=Q&(c)=O&(c)=*0*&(c)=w&(C)=a&(c)(val)?(val)+l:(val)返回數(shù)組元素的個數(shù)#defineARR_SIZE(a)(sizeof(a)/sizeof(a0)返回個無符號數(shù)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空間映射在存儲空間的結(jié)構(gòu),輸入輸出處理#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,使用一些宏跟蹤調(diào)試ANSI標準說明了五個預(yù)定義的宏名。它們是:LINE_FILE_DATE_TIME_STDC_如果編譯不是標準的,則可能僅支持以上宏名中的兒個,或根本不支持。記住編譯程序也許還提供其它預(yù)定義的宏名。_LINE-及_FILE_宏指令在有關(guān)#Iine的部分中已討論,這里討論其余的宏名。.DATE_宏指令含有形式為月/日/年的串,表示源文件被翻譯到代碼時的日期。

9、源代碼翻譯到目標代碼的時間作為串包含在_TIME_中。串形式為時:分:秒。如果實現(xiàn)是標準的,則宏_STDC_含有十進制常量1。如果它含有任何其它數(shù),則實現(xiàn)是非標準的。可以定義宏,例如:當定義了_DEBUG,輸出數(shù)據(jù)信息和所在文件所在行#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+;應(yīng)用時:if(-.)DO(a,b);產(chǎn)生錯誤else解決方法:#difneDO(a,b)doa+b;a+;while(O)宏中”#和”#的用法一、一-般用法我們使用#把宏參數(shù)變?yōu)橐粋€字符串,用#把明個宏參數(shù)貼合在一起.用法:#include#includeusingnamespacestd;#defineSTR#s#defineCONS(a,b)int(a#e#b)intmain()printf(STR(vck);/輸出字符串”vckprintf(,%dn,zCONS(2,3);/2e3輸111:2000return0;二、當宏參數(shù)是另一個宏的時候需

11、要注意的是凡宏定義里有用#或#的地方宏參數(shù)是不會再展開.非#和#的情況#defineTOW(2)#defineMUL(azb)(a*b)printf(,%d*%d=%dn,zTOgTOMUL(TOWTOW);這行的宏會被展開為:pnntf(%d*%d=%dn;(2),(2),(2)*(2);MUL里的參數(shù)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都不會再被展開,然而解決這個問題的方法很簡單.加多一層中間轉(zhuǎn)換宏.加這層宏的用意是把所有宏的參數(shù)在這層里全部展開,那么在轉(zhuǎn)換宏里的那一個宏(_STR)就能得到正確的宏參數(shù)#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)/轉(zhuǎn)換宏/轉(zhuǎn)換宏printf(Hintmax:%sn,/STR(INT_MAX);/INT_MAX,int型的最人值,為一個變量#include輸岀為:intmax:0 x7fffffffSTR(INT_MAX)-_STR(0 x7fffffff)然后再轉(zhuǎn)換成字符典pintfr%dn:CONS(A,A);輸出為:200CONS(A,A)-_CONS(2),(2)int(2)e(2)三、申和#的一些應(yīng)用特例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、填充結(jié)構(gòu)#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、得到一個數(shù)值類型所対應(yīng)的字符串緩沖人小#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語言實現(xiàn)動態(tài)數(shù)組test.h#ifndefTEST.H#defineTEST.HtemplateclassArrayprivate:T*parray;introom;定義動態(tài)數(shù)組存儲空間人小的值public:Array():room(0),parray(NULL)parray=(int*)malloc(siz

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

18、);voiddisplayO顯示數(shù)組內(nèi)元素個數(shù)for(inti=0;iroom;i+)coutquery(i)endl;cout數(shù)組內(nèi)元素個數(shù)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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論