• <tbody id="wslfv"><pre id="wslfv"></pre></tbody>
    <span id="wslfv"></span>
    <tbody id="wslfv"><pre id="wslfv"></pre></tbody>
    <th id="wslfv"><track id="wslfv"><rt id="wslfv"></rt></track></th>

    <li id="wslfv"><acronym id="wslfv"></acronym></li>
    更多課程 選擇中心

    嵌入式培訓
    達內IT學院

    400-111-8989

    嵌入式開發中為什么要使用宏定義?

    • 發布:嵌入式培訓
    • 來源:嵌入式教程
    • 時間:2019-11-19 15:47

    在嵌入式系統中,軟件編寫過程中經常會用到宏定義,本文將對宏定義進行詮釋,并給出宏定義的使用例子。除了文中給出的幾種情況之外,還有其他情況下需要使用宏定義嗎?在其他情況之下宏定義分別起到了什么樣的作用?

    宏定義是C語言提供的三種預處理功能的其中一種,這三種預處理包括:宏定義、文件包含、條件編譯。宏定義和操作符的區別是:宏定義是替換,不做計算,也不做表達式求解。宏定義又稱為宏代換、宏替換,簡稱“宏”。在 C 語言中,宏是產生內嵌代碼的唯一方法。對于嵌入式系統而言,為了能達到性能要求,宏是一種很好的代替函數的方法。

    宏定義的格式:#DEFINE 標識符 字符串

    掌握"宏"概念的關鍵是“換”,一切以換為前提、做任何事情之前先要換,準確理解之前就要“換”,即在對相關命令或語句的含義和功能作具體分析之前就要換。

    定義宏需要注意以下幾點:

    (1)宏名一般用大寫;

    (2)使用宏可提高程序的通用性和易讀性,減少不一致性,減少輸入錯誤和便于修改。例如:數組大小常用宏定義;

    (3)預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做語法檢查;

    (4)宏定義末尾不加分號;

    (5)宏定義寫在函數的花括號外邊,作用域為其后的程序,通常在文件的最開頭;

    (6)可以用#undef命令終止宏定義的作用域;

    (7)宏定義允許嵌套;

    (8)字符串( " " )中永遠不包含宏;

    (9)宏定義不分配內存,變量定義分配內存;

    (10)宏定義不存在類型問題,它的參數也是無類型的。

    在C語言/類C語言環境中,宏的作用有如下幾種:

    1.取代Magic Number

    這個作用在嵌入式開發時太重要了。一個SoC 50多頁的datasheet,上百個寄存器的位操作,如果沒有很好的語義宏定義,調程序查手冊絕對是崩潰的節奏!

    2.防止重復定義

    #ifndef XXXX

    #define XXXX

    #endif

    3.快速控制代碼編譯

    #define SIMULATION_DEBUG 1

    #if SIMULATION_DEBUG

    use simulated data

    #else

    real data

    #endif

    4.編譯系統控制鏈

    在某些系統下,可以把宏定義傳遞給編譯器,從而通過編譯腳本(makefile)來控制編譯選項,例如,配合上面代碼,就可以在Makefile里定義:

    CDEFINES=$(CDEFINES) /SIMULATION_DEBUG

    說到編譯,自然還要提一下 ANSI C中預定義的幾個非常有用的編譯宏:

    ? _ L I N E _

    ? _ F I L E _

    ? _ D A T E _

    ? _ T I M E _

    ? _ S T D C _

    例如

    #define DEBUGMSG(msg,date) printf(msg);

    printf(“%d%d%d”,date,_LINE_,_FILE_)

    5.使用typedef

    C語言下typedef也是屬于宏定義,我會告訴你C語言下struct+typedef+函數指針可以做到面向對象的繼承,重載和多態嗎?(有興趣可以看一下MFC的源碼實現,把傳統的C風格的Windows API各種包裝修飾和裝逼。)

    typedef int (*PFFunc1)(int);

    6.簡化操作

    得到一個字的高位和低位字節

    #define WORD_LO(xxx) ((byte) ((word)(xxx) & 255))

    #define WORD_HI(xxx) ((byte) ((word)(xxx) >> 8))

    版權聲明:轉載文章來自公開網絡,版權歸作者本人所有,推送文章除非無法確認,我們都會注明作者和來源。如果出處有誤或侵犯到原作者權益,請與我們聯系刪除或授權事宜。

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:怎么查看嵌入式jetty中運行日志?
    下一篇:Python和嵌入式的區別是什么?可以做嵌入式開發嗎?

    裸編程怎么做?裸編程具體做法

    嵌入式編程中你必須知道的小知識

    嵌入式C語言編程小知識總結

    有哪些工具可以讓嵌入式開發事半功倍?

    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    欧美一级高清片,一级欧美免费大片视频,欧美三级在线电影免费 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>