寫出高效優(yōu)美的單片機(jī)C語言代碼
14,判斷字符是不是16進(jìn)值的數(shù)字
#define HEXCHK( c ) ( ((c) >= '0' (c) = '9') ||
((c) >= 'A' (c) = 'F') ||
((c) >= 'a' (c) = 'f') )
15,防止溢出的一個(gè)方法
#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))
16,返回?cái)?shù)組元素的個(gè)數(shù)
#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
17,返回一個(gè)無符號數(shù)n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)
#define MOD_BY_POWER_OF_TWO( val, mod_by )
( (dword)(val) (dword)((mod_by)-1) )
18,對于IO空間映射在存儲空間的結(jié)構(gòu),輸入輸出處理
#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, val) (*((volatile word *) (port)) = ((word) (val)))
#define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val)))
19,使用一些宏跟蹤調(diào)試
A N S I標(biāo)準(zhǔn)說明了五個(gè)預(yù)定義的宏名。它們是:
_ L I N E _
_ F I L E _
_ D A T E _
_ T I M E _
_ S T D C _
如果編譯不是標(biāo)準(zhǔn)的,則可能僅支持以上宏名中的幾個(gè),或根本不支持。記住編譯程序也許還提供其它預(yù)定義的宏名。
_ L I N E _及_ F I L E _宏指令在有關(guān)# l i n e的部分中已討論,這里討論其余的宏名。
_ D AT E _宏指令含有形式為月/日/年的串,表示源文件被翻譯到代碼時(shí)的日期。
源代碼翻譯到目標(biāo)代碼的時(shí)間作為串包含在_ T I M E _中。串形式為時(shí):分:秒。
如果實(shí)現(xiàn)是標(biāo)準(zhǔn)的,則宏_ S T D C _含有十進(jìn)制常量1。如果它含有任何其它數(shù),則實(shí)現(xiàn)是非標(biāo)準(zhǔn)的。
可以定義宏,例如: 當(dāng)定義了_DEBUG,輸出數(shù)據(jù)信息和所在文件所在行
#ifdef _DEBUG
#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)
#else
#define DEBUGMSG(msg,date)
#endif
20,宏定義防止使用時(shí)錯(cuò)誤用小括號包含。
例如:#define ADD(a,b) (a+b)
用do{}while(0)語句包含多語句防止錯(cuò)誤
例如:#difne DO(a,b) a+b;
a++;
應(yīng)用時(shí):if(….)
DO(a,b); //產(chǎn)生錯(cuò)誤
else
解決方法: #difne DO(a,b) do{a+b;
a++;}while(0)
宏中"#"和"##"的用法
一、一般用法
我們使用#把宏參數(shù)變?yōu)橐粋€(gè)字符串,用##把兩個(gè)宏參數(shù)貼合在一起.
用法:
#include
#include
using namespace std;
#define STR(s) #s
#define CONS(a,b) int(a##e##b)
int main()
{
printf(STR(vck)); // 輸出字符串"vck"
printf("%dn", CONS(2,3)); // 2e3 輸出:2000
return 0;
}
二、當(dāng)宏參數(shù)是另一個(gè)宏的時(shí)候
需要注意的是凡宏定義里有用'#'或'##'的地方宏參數(shù)是不會再展開.
1, 非'#'和'##'的情況
#define TOW (2)
#define MUL(a,b) (a*b)
printf("%d*%d=%dn", TOW, TOW, MUL(TOW,TOW));
這行的宏會被展開為:
printf("%d*%d=%dn", (2), (2), ((2)*(2)));
MUL里的參數(shù)TOW會被展開為(2).
2, 當(dāng)有'#'或'##'的時(shí)候
#define A (2)
#define STR(s) #s
#define CONS(a,b) int(a##e##b)
printf("int max: %sn", STR(INT_MAX)); // INT_MAX #include
c語言相關(guān)文章:c語言教程
評論