



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、C語言宏定義方法總結(jié)寫好C語言,漂亮的宏定義很重要,使用宏定義可以防止出錯,提高可移植性, 可讀性,方便性 等等。下面列舉一些成熟軟件中常用得宏定義。 1,防止一個頭文件被重復包含#ifndef COMDEF_H#defi ne COMDEF_H頭文件內(nèi)容#en dif2,重新定義一些類型,防止由于各種平臺和編譯器的不同,而產(chǎn)生的類型字節(jié) 數(shù)差異,方便移植。typedef un sig ned char boolea n; /* Boolea n value type. */typedef un sig ned long int uin t32; /* Un sig ned 32 bit va
2、lue */ typedef un sig ned short uin t16; /* Un sig ned 16 bit value */ typedef un sig ned char uin t8; /* Un sig ned 8 bit value */ typedef signed long int int32; /* Signed 32 bit value */ typedef signed short int16; /* Signed 16 bit value */ typedef sig ned char in t8; /* Signed 8 bit value */3,求最大
3、值和最小值#defi ne MAX( x, y ) ( (x) > (y) ? (x) : (y)#defi ne MIN( x, y ) ( (x) < (y) ? (x) : (y)4, 得到指定地址上的一個字節(jié)或字#defi ne MEM_B( x ) ( *( (byte *) (x) #defi ne MEM_W( x ) ( *( (word *) (x)5, 得到一個結(jié)構體中field所占用的字節(jié)數(shù)#defi ne FSIZ( type, field ) sizeof( (type *) 0)->field )6,得到一個field在結(jié)構體(struct)中的偏
4、移量#defi ne FPOS( type, field ) /*li nt -e545 */ ( (dword) &( type *) 0)-> field ) /*li nt +e545 */7, 按照LSB格式把兩個字節(jié)轉(zhuǎn)化為一個 Word#defi ne FLIPW( ray ) ( (word) (ray)0) * 256) + (ray)1)8, 按照LSB格式把一個 Word轉(zhuǎn)化為兩個字節(jié)#define FLOPW( ray, val ) (ray)0 = (val) / 256); (ray)1 = (val) & 0xFF)9,得到一個變量的地址(wor
5、d寬度)#define B_PTR( var ) ( (byte *) (void *) &(var)#define W_PTR( var ) ( (word *) (void *) &(var)10, 得到一個字的高位和低位字節(jié)#define WORD_LO(xxx) (byte) (word)(xxx) & 255)#defi ne WORD_HI(xxx) (byte) (word)(xxx) >> 8)11, 返回一個比X大的最接近的8的倍數(shù)#define RND8( x ) (x) + 7) / 8 ) * 8 )12, 將一個字母轉(zhuǎn)換為大寫#de
6、fi ne UPCASE( c ) ( (c) >= 'a' && (c) <= 'z') ? (c) - 0x20) : (c)13, 判斷字符是不是16進值的數(shù)字#defi ne HEXCHK( c ) ( (c) >= '0' && (c) <= 9) |(c) >= 'A' && (c) <= 'F') |(c) >= 'a' && (c) <= 'f)14, 判斷字符是不
7、是10進值的數(shù)字#defi ne DECCHK( c ) (c) >= '0' && (c) <= 9)15, 防止溢出的一個方法#define INC_SAT( val ) (val = (val)+1 > (val) ? (val)+1 : (val)16, 返回數(shù)組元素的個數(shù)#defi ne ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a0)17, 返回一個無符號數(shù) n 尾的值 MOD_BY_POWER_OF_TWO(X,n) =X%(2An) #defi ne MOD_BY_POWER_OF_TWO
8、( val, mod_by ) (dword)(val) & (dword)(mod_by)-1)18, 對于IO空間映射在存儲空間的結(jié)構,輸入輸出處理#define inp(port) (*(volatile byte *) (port)#define inpw(port) (*(volatile word *) (port)#define inpdw(port) (*(volatile dword *)(port)#define outp(port, val) (*(volatile byte *) (port) = (byte) (val)#define outpw(port,
9、val) (*(volatile word *) (port) = (word) (val)#define outpdw(port, val) (*(volatile dword *) (port) = (dword) (val)19, 使用一些宏跟蹤調(diào)試A N S I標準說明了五個預定義的宏名。它們是:_ L I N E _ F I L E _ D A T E _ T I M E _ S T D C _如果編譯不是標準的,則可能僅支持以上宏名中的幾個,或根本不支持。記住編 譯程序也許還提供其它預定義的宏名。_ L I N E _及_ F I L E _宏指令在有關# l i n e的部分中已
10、討論,這里討論其余的宏 名。_ D AT E _宏指令含有形式為月/日/年的串,表示源文件被翻譯到代碼時的 日期。源代碼翻譯到目標代碼的時間作為串包含在 _ T I M E_中。串形式為時: 分:秒。如果實現(xiàn)是標準的,則宏_ S T D C _含有十進制常量1。如果它含有任何其它 數(shù),則實現(xiàn)是非標準的。可以定義宏,例如:當定義了 _DEBUG,輸出數(shù)據(jù)信息和所在文件所在行#ifdef _DEBUG#defi ne DEBUGMSG(msg,date) pri ntf(msg);pri ntf(“ d%d%d ,date,_LINE_,_FILE_)#else#defi ne DEBUGMSG(
11、msg,date)#en dif20, 宏定義防止使用是錯誤 用小括號包含。例如:#define ADD(a,b) ( a+b)用dowhile(0)語句包含多語句防止錯誤例如:#difne DO(a,b) a+b;a+;應用時:if(.) DO(a,b); 產(chǎn)生錯誤 else解決方法:#difne DO(a,b) doa+b;a+;while(0) 宏中"#"和"#"的用法一、一般用法我們使用#把宏參數(shù)變?yōu)橐粋€字符串,用#把兩個宏參數(shù)貼合在一起 用法:#in clude<cstdio>#i nclude<climits> usi
12、ng n amespace std;#defi ne STR(s) #s#defi ne CONS(a,b) in t(a#e#b) int main()printf(STR(vck); / 輸出字符串"vck"printf("%d ", CONS(2,3); / 2e3 輸出:2000return 0;二、當宏參數(shù)是另一個宏的時候 需要注意的是凡宏定義里有用#或'#'的地方宏參數(shù)是不會再展開1, 非#和'#'的情況#defi ne TOW (2)#defi ne MUL(a,b) (a*b)prin tf("%
13、d*%d=%d ", TOW, TOW, MUL(TOW,TOW);這行的宏會被展開為:prin tf("%d*%d=%d ", (2), (2), (2)*(2);MUL里的參數(shù)TOW會被展開為(2).2, 當有'#或'#'的時候#defi ne A (2)#defi ne STR(s) #s#defi ne CONS(a,b) in t(a#e#b)prin tf(" int max: %s", STR(INT_MAX); / INT_MAX #i nclude<climits>這行會被展開為:prin
14、tf("i nt max: %s", "INT_MAX");prin tf("%s", CONS(A, A); / compile error這一行則是:prin tf("%s", i nt(AeA);INT_MAX和A都不會再被展開,然而解決這個問題的方法很簡單.加多一層中間 轉(zhuǎn)換宏.加這層宏的用意是把所有宏的參數(shù)在這層里全部展開,那么在轉(zhuǎn)換宏里的那一個 宏(_STR)就能得到正確的宏參數(shù).#defi ne A (2)#defi ne _STR(s) #s#defi ne STR(s) _STR(s) / 轉(zhuǎn)換宏
15、#defi ne _CONS(a,b) in t(a#e#b)#defi ne CONS(a,b) _CONS(a,b) /轉(zhuǎn)換宏prin tf("i nt max: %s", STR(INT_MAX); / INT_MAX,i nt型的最大值,為一個變量#include<climits> 輸出為:int max: 0x7fffffffSTR(INT_MAX) -> _STR(0x7fffffff) 然后再轉(zhuǎn)換成字符串;prin tf("%d", CONS(A, A);輸出為:200 CONS(A, A) -> _CONS(2),
16、 (2) -> int(2)e(2)三、#和'#'的一些應用特例1合并匿名變量名#defi neANONYMOUS1(type, var, line) type var#li ne#defi ne _ANONYMOUS0(type, line)ANONYMOUS1(type, _anony mous, li ne)#defi ne ANONYMOUS(type) _ANONYMOUS0(type, _LINE_) 例:ANONYMOUS(static int);即:static int _anonymous70; 70表示該行行號; 第一層:ANONYMOUS(stati
17、c int); -> _ANONYMOUS0(static int, _LINE_);第二層:->ANONYMOUS1(static in t, _a nony mous, 70);第三層:-> static int _anonym ous70;即每次只能解開當前層的宏,所以 _LINE_在第二層才能被解開;2、填充結(jié)構#defi ne FILL(a) a, #aenum IDDOPEN, CLOSE;typedef struct MSGIDD id;const char * msg;MSG;MSG _msg = FILL(OPEN), FILL(CLOSE);相當于:MSG _msg = OPEN, "OPEN",CLOSE, "CLOSE"3、記錄文件名#defi ne _GET_FILE_NAME(f) #f#defi ne GET_FILE_NAME(f) _GET_FILE_NAME(f) static char FILE
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 橋基礎專項施工方案
- 小區(qū)墻繪施工方案
- 電信施工方案應急預案
- 水泥花磚施工方案
- 水下灌注樁施工方案
- 換熱站安裝施工方案
- 二零二五年度診所執(zhí)業(yè)醫(yī)師醫(yī)療質(zhì)量控制聘用合同
- 2025年度高端美容院股權合作框架協(xié)議
- 二零二五年度停車場租賃與停車場設施維護協(xié)議
- 2025年度酒店與慈善機構住宿協(xié)議價合同
- 《紙馬》教學設計公開課
- 西服裙縫制工藝課件(PPT 14頁)
- 城市道路綠化養(yǎng)護工作
- 高等數(shù)學第一節(jié) 原函數(shù)與不定積分ppt課件
- 國內(nèi)木材炭化技術專利現(xiàn)狀
- 施耐德公司品牌戰(zhàn)略
- 校企合作人才培養(yǎng)模式實踐研究開題報告定稿
- 城市供水計劃統(tǒng)計指標解釋
- 塑膠原料檢驗規(guī)范
- 建筑公司內(nèi)部管理流程-課件PPT
- 中國古典舞PPT課件
評論
0/150
提交評論