使用宏定義可以防止出錯(cuò),提高可移植性,可讀性,方便性等。
下面列舉了一些成熟軟件中常用的宏定義。
重新定義一些類(lèi)型,防止由于各種平臺(tái)和編譯器的不同,而產(chǎn)生的類(lèi)型字節(jié)數(shù)差異,方便移植:
typedefunsignedcharboolean;/*Booleanvaluetype.*/ typedefunsignedlongintuint32;/*Unsigned32bitvalue*/ typedefunsignedshortuint16;/*Unsigned16bitvalue*/ typedefunsignedcharuint8;/*Unsigned8bitvalue*/ typedefsignedlongintint32;/*Signed32bitvalue*/ typedefsignedshortint16;/*Signed16bitvalue*/ typedefsignedcharint8;/*Signed8bitvalue*/
求最大值和最小值:
#defineMAX(x,y)(((x)>(y))?(x):(y)) #defineMIN(x,y)(((x)(y))???(x)?:?(y)?)
得到一個(gè)field在結(jié)構(gòu)體(struct)中的偏移量:
#defineFPOS(type,field) /*lint-e545*/((dword)&((type*)0)->field)/*lint+e545*/
得到一個(gè)結(jié)構(gòu)體中field所占用的字節(jié)數(shù):
#defineFSIZ(type,field)sizeof(((type*)0)->field)
按照LSB格式把兩個(gè)字節(jié)轉(zhuǎn)化為一個(gè)Word:
1#defineFLIPW(ray)((((word)(ray)[0])*256)+(ray)[1])
按照LSB格式把一個(gè)Word轉(zhuǎn)化為兩個(gè)字節(jié):
#defineFLOPW(ray,val) (ray)[0]=((val)/256); (ray)[1]=((val)&0xFF)
得到一個(gè)變量的地址(word寬度):
#defineB_PTR(var)((byte*)(void*)&(var)) #defineW_PTR(var)((word*)(void*)&(var))
得到一個(gè)字的高位和低位字節(jié):
#defineWORD_LO(xxx)((byte)((word)(xxx)&255)) #defineWORD_HI(xxx)((byte)((word)(xxx)>>8))
將一個(gè)字母轉(zhuǎn)換為大寫(xiě):
#defineUPCASE(c)(((c)>='a'&&(c)<=?'z')???((c)?-?0x20)?:?(c)?)
判斷字符是不是10進(jìn)制的數(shù)字:
#define DECCHK( c ) ((c) >= '0' && (c) <= '9')
判斷字符是不是16進(jìn)制的數(shù)字:
#defineHEXCHK(c)(((c)>='0'&&(c)<=?'9')?|| ((c)?>='A'&&(c)<=?'F')?|| ((c)?>='a'&&(c)<=?'f')?)
防止一個(gè)頭文件被重復(fù)包含:
#ifndefCOMDEF_H #defineCOMDEF_H //頭文件內(nèi)容 #endif
防止溢出的一個(gè)方法:
#defineINC_SAT(val)(val=((val)+1>(val))?(val)+1:(val))
返回?cái)?shù)組元素的個(gè)數(shù):
#defineARR_SIZE(a)(sizeof((a))/sizeof((a[0])))
審核編輯:劉清
-
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7530瀏覽量
164417 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7615瀏覽量
137863 -
LSB算法
+關(guān)注
關(guān)注
0文章
7瀏覽量
5837
原文標(biāo)題:寫(xiě)好C語(yǔ)言,漂亮的宏定義很重要!
文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論