新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 寫出高效優(yōu)美的單片機(jī)C語言代碼

        寫出高效優(yōu)美的單片機(jī)C語言代碼

        作者: 時間:2013-07-01 來源:網(wǎng)絡(luò) 收藏

        14,判斷字符是不是16進(jìn)值的數(shù)字

        #define HEXCHK( c ) ( ((c) >= '0' (c) = '9') ||

        ((c) >= 'A' (c) = 'F') ||

        ((c) >= 'a' (c) = 'f') )

        15,防止溢出的一個方法

        #define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))

        16,返回數(shù)組元素的個數(shù)

        #define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )

        17,返回一個無符號數(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)說明了五個預(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)的,則可能僅支持以上宏名中的幾個,或根本不支持。記住編譯程序也許還提供其它預(yù)定義的宏名。

        _ L I N E _及_ F I L E _宏指令在有關(guān)# l i n e的部分中已討論,這里討論其余的宏名。

        _ D AT E _宏指令含有形式為月/日/年的串,表示源文件被翻譯到時的日期。

        翻譯到目標(biāo)的時間作為串包含在_ T I M E _中。串形式為時:分:秒。

        如果實現(xiàn)是標(biāo)準(zhǔn)的,則宏_ S T D C _含有十進(jìn)制常量1。如果它含有任何其它數(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,宏定義防止使用時錯誤用小括號包含。

        例如:#define ADD(a,b) (a+b)

        用do{}while(0)語句包含多語句防止錯誤

        例如:#difne DO(a,b) a+b;

        a++;

        應(yīng)用時:if(….)

        DO(a,b); //產(chǎn)生錯誤

        else

        解決方法: #difne DO(a,b) do{a+b;

        a++;}while(0)

        宏中"#"和"##"的用法

        一、一般用法

        我們使用#把宏參數(shù)變?yōu)橐粋€字符串,用##把兩個宏參數(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ù)是另一個宏的時候

        需要注意的是凡宏定義里有用'#'或'##'的地方宏參數(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)有'#'或'##'的時候

        #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語言教程




        關(guān)鍵詞: 單片機(jī) C語言 代碼

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 富平县| 德安县| 陵川县| 海门市| 壤塘县| 蒲江县| 徐州市| 萍乡市| 泸州市| 都兰县| 科技| 义马市| 天柱县| 雅江县| 盐亭县| 富平县| 临武县| 绍兴县| 乌兰浩特市| 朝阳县| 永修县| 新乐市| 桂林市| 淮安市| 靖边县| 庆元县| 湾仔区| 政和县| 昭苏县| 保康县| 克拉玛依市| 响水县| 屏东县| 鄂托克旗| 博野县| 五常市| 新郑市| 中方县| 常宁市| 青神县| 龙州县|