色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

宏技巧在C語(yǔ)言、嵌入式中的應(yīng)用

strongerHuang ? 來(lái)源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2020-08-25 17:00 ? 次閱讀

宏打印函數(shù)

在我們的嵌入式開(kāi)發(fā)中,使用printf打印一些信息是一種常用的調(diào)試手段。但是,在打印的信息量比較多的時(shí)候,就比較難知道哪些信息在哪個(gè)函數(shù)里進(jìn)行打印。

特別是對(duì)于異常情況的打印,我們需要快速定位到異常情況的位置。

這時(shí)候我們可以使用宏定義來(lái)封裝一個(gè)宏打印函數(shù),這個(gè)宏打印函數(shù)可以顯示打印信息所在的文件、行數(shù)、函數(shù)名等信息。如:

左右滑動(dòng)查看全部代碼>>>

#defineDBG_PRINTF(fmt,args...)
{
printf("<>",__FILE__,__LINE__,__FUNCTION__);
printf(fmt,##args);
}

使用范例:

可見(jiàn),使用方法與printf的使用方法一樣,而且每條打印語(yǔ)句開(kāi)頭都會(huì)打印調(diào)試信息所在的文件名、行號(hào)、函數(shù)名信息,方便我們查找一些調(diào)試信息。

其中,__FILE__、__LINE__、__FUNCTION__這三個(gè)宏是編譯器內(nèi)置宏定義,分別代表調(diào)試信息所在文件、行號(hào)、函數(shù)。

除此之外,常用的宏還有:__DATE__、__TIME__,分別代表當(dāng)前的編譯日期與時(shí)間。如:

DBG_PRINTF("Compile Time: %s  %s
", __DATE__, __TIME__);

第二條printf中的##符號(hào)是為了處理args不代表任何參數(shù)的情況。如:

DBG_PRINTF("Hello world");

當(dāng)不加##符號(hào)是,以上宏的第二條語(yǔ)句被拓展為:

printf("Helloworld
",);

可見(jiàn),多出了一個(gè)逗號(hào),這個(gè)逗號(hào)是多余的。

加上##符號(hào)后,以上宏的第二條語(yǔ)句被拓展為:

printf("Helloworld
");

這才是我們想要的結(jié)果。其實(shí)這些結(jié)果我們通過(guò)查看預(yù)處理文件可以清晰的知道:

最后需要注意的是,這個(gè)DBG_PRINTF還是與printf不一樣的。DBG_PRINTF宏是兩條語(yǔ)句的組合,無(wú)返回值;而printf的原型是:

intprintf(constchar*__format,...)

但是我們一般都很少使用printf的返回值,所以DBG_PRINTF的用法與printf函數(shù)基本一致。

打印調(diào)試宏開(kāi)關(guān)

通常情況下,一些打印調(diào)試信息只是在我們調(diào)試階段需要的,在程序發(fā)布階段是不需要的。

所以,為了避免打印調(diào)試信息帶來(lái)的資源開(kāi)銷,我們可以把這些打印調(diào)試語(yǔ)句給注釋掉。

一種方法是逐句進(jìn)行注釋,這是一種比較低效的方法。比較高效的方法就是添加調(diào)試宏開(kāi)關(guān),利用條件編譯來(lái)選擇打印/不打印調(diào)試信息。

比如我們可以把上面的代碼改造為:

#defineDEBUG1

#ifDEBUG
#defineDBG_PRINTF(fmt,args...)
{
printf("<>",__FILE__,__LINE__,__FUNCTION__);
printf(fmt,##args);
}
#else
#defineDBG_PRINTF(fmt,args...)
#endif

根據(jù)DEBUG宏的值來(lái)選擇對(duì)應(yīng)的打印宏函數(shù)。當(dāng)DEBUG的值為1時(shí)啟動(dòng)相關(guān)的打印調(diào)試語(yǔ)句,DEBUG的值為0時(shí)則關(guān)閉打印調(diào)試語(yǔ)句。

這樣我們就可以很方便的通過(guò)設(shè)置DEBUG宏的值來(lái)啟動(dòng)與關(guān)閉我們整個(gè)工程的DBG_PRINTF打印調(diào)試信息。

do{}while(0)

其實(shí),上面我們封裝的打印宏DBG_PRINTF還有一點(diǎn)缺陷,比如我們與if、else使用的時(shí)候,會(huì)有這樣的一種使用情況:

此時(shí)會(huì)報(bào)語(yǔ)法錯(cuò)誤。為什么呢?

同樣的,我們可以先來(lái)看一下我們的demo代碼預(yù)處理過(guò)后,相應(yīng)的宏代碼會(huì)被轉(zhuǎn)換為什么。如:

這里我們可以看到,我們的if、else結(jié)構(gòu)代碼被替換為如下形式:

if(c)
{/*.......*/};
else
{/*.......*/};

顯然,出現(xiàn)了語(yǔ)法錯(cuò)誤。if之后的大括號(hào)之后不能加分號(hào),這里的分號(hào)其實(shí)可以看做一條空語(yǔ)句,這個(gè)空語(yǔ)句會(huì)把if與else給分隔開(kāi)來(lái),導(dǎo)致else不能正確匹配到if,導(dǎo)致語(yǔ)法錯(cuò)誤。

為了解決這個(gè)問(wèn)題,有幾種方法。第一種方法是:把分號(hào)去掉。代碼變成:

第二種方法是:在if之后使用DBG_PRINTF打印調(diào)試時(shí)總是加{}。代碼變成:

以上兩種方法都可以正常編譯、運(yùn)行了。

但是,我們C語(yǔ)言中,每條語(yǔ)句往往以分號(hào)結(jié)尾;并且,總有些人習(xí)慣在if判斷之后只有一條語(yǔ)句的情況下不加大括號(hào);而且我們創(chuàng)建的DBG_PRINTF宏函數(shù)的目的就是為了對(duì)標(biāo)printf函數(shù),printf函數(shù)的使用加分號(hào)在任何地方的使用都是沒(méi)有問(wèn)題的。

基于這幾個(gè)原因,我們有必要再對(duì)我們的DBG_PRINTF宏函數(shù)進(jìn)行一個(gè)改造。

下面引入do{}while(0)來(lái)對(duì)我們的DBG_PRINTF進(jìn)行一個(gè)簡(jiǎn)單的改造。改造后的DBG_PRINTF宏函數(shù)如下:

#define DBG_PRINTF(fmt, args...)  
do
{
    printf("<> ", __FILE__, __LINE__, __FUNCTION__);
    printf(fmt, ##args);
}while(0)

這里的do...while循環(huán)的循環(huán)體只執(zhí)行一次,與不加循環(huán)是效果一樣。并且,可以避免了上面的問(wèn)題。預(yù)處理文件:

我們的宏函數(shù)實(shí)體中,while(0)后面不加分號(hào),在實(shí)際調(diào)用時(shí)補(bǔ)上分號(hào),既符合了C語(yǔ)言語(yǔ)句分號(hào)結(jié)尾的習(xí)慣,也符合了do...while的語(yǔ)法規(guī)則。

使用do{}while(0)來(lái)封裝宏函數(shù)可能會(huì)讓很多初學(xué)者看著不習(xí)慣,但必須承認(rèn)的是,這確確實(shí)實(shí)是一種很常用的方法。

STM32的HAL庫(kù)中搜索while(0):

Linux源碼中搜索while(0):

可見(jiàn),在實(shí)際應(yīng)用中,do{}while(0)用的很多。

#運(yùn)算符與##運(yùn)算符

這兩個(gè)運(yùn)算符之前也有分享過(guò),這里順便也提一下。

#號(hào)作為一個(gè)預(yù)處理運(yùn)算符,可以把記號(hào)轉(zhuǎn)換成字符串。

例如,如果A是一個(gè)宏形參,那么#A就是轉(zhuǎn)換為字符串"A"的形參名。這個(gè)過(guò)程稱為字符串化(stringizing)。以下程序演示這個(gè)過(guò)程:

##運(yùn)算符可以把兩個(gè)記號(hào)組合成一個(gè)記號(hào)。以下程序演示這個(gè)過(guò)程:

這個(gè)運(yùn)算符用得很多。如:

????????????????END????????????????
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5082

    文章

    19111

    瀏覽量

    304847
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136710
  • 宏定義
    +關(guān)注

    關(guān)注

    0

    文章

    50

    瀏覽量

    9007

原文標(biāo)題:C語(yǔ)言、嵌入式中幾個(gè)非常實(shí)用的宏技巧

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    標(biāo)準(zhǔn)C語(yǔ)言嵌入式C語(yǔ)言有哪些區(qū)別

    世界使用最廣泛的系統(tǒng)編程語(yǔ)言。嵌入式CC的擴(kuò)展,嵌入式系統(tǒng)
    發(fā)表于 12-14 06:15

    C語(yǔ)言嵌入式的特色

    1、聊一聊本文是bug菌為大家整理的好文,C語(yǔ)言其實(shí)是非常簡(jiǎn)潔的語(yǔ)言,語(yǔ)法相比那些高級(jí)語(yǔ)言可以說(shuō)非常小巧了,然而C
    發(fā)表于 02-17 07:27

    嵌入式c語(yǔ)言編程(由淺入深)

    本內(nèi)容詳細(xì)介紹了嵌入式c語(yǔ)言編程的各項(xiàng)知識(shí),包括嵌入式c語(yǔ)言編程,
    發(fā)表于 11-02 14:37 ?0次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言</b>編程(由淺入深)

    嵌入式C_C++語(yǔ)言精華

    介紹了嵌入式開(kāi)發(fā)的過(guò)程,c語(yǔ)言C++語(yǔ)言的施用
    發(fā)表于 03-17 09:54 ?2次下載

    嵌入式系統(tǒng)為什么選擇C語(yǔ)言作為開(kāi)發(fā)語(yǔ)言

    了解嵌入式開(kāi)發(fā)的朋友們都非常的清楚其核心的開(kāi)發(fā)語(yǔ)言C語(yǔ)言,C語(yǔ)言
    發(fā)表于 07-10 17:01 ?2043次閱讀

    嵌入式外中斷c語(yǔ)言代碼

    嵌入式外中斷c語(yǔ)言代碼(arm嵌入式開(kāi)發(fā)實(shí)例)-嵌入式外中斷c
    發(fā)表于 07-30 11:29 ?4次下載
    <b class='flag-5'>嵌入式</b>外中斷<b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言</b>代碼

    嵌入式C語(yǔ)言-文件操用

    嵌入式C語(yǔ)言-文件操用(嵌入式開(kāi)發(fā)需要什么證書(shū))-嵌入式C語(yǔ)
    發(fā)表于 07-30 11:56 ?15次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>-文件操用

    嵌入式底層開(kāi)發(fā)為什么選擇C語(yǔ)言

    嵌入式底層開(kāi)發(fā)為什么選擇C語(yǔ)言嵌入式系統(tǒng)的編寫(xiě)語(yǔ)言主要是C語(yǔ)
    發(fā)表于 10-20 13:35 ?2次下載
    <b class='flag-5'>嵌入式</b>底層開(kāi)發(fā)為什么選擇<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>

    標(biāo)準(zhǔn)c語(yǔ)言嵌入式,嵌入式C語(yǔ)言C語(yǔ)言的區(qū)別

    嵌入式C語(yǔ)言C語(yǔ)言的區(qū)別:最常用的系統(tǒng)編程語(yǔ)言C
    發(fā)表于 10-20 14:06 ?6次下載
    標(biāo)準(zhǔn)<b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言</b>與<b class='flag-5'>嵌入式</b>,<b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>與<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的區(qū)別

    嵌入式linux c語(yǔ)言,嵌入式LinuxC語(yǔ)言開(kāi)發(fā)工具.pdf

    2 章 嵌入式Linux C 語(yǔ)言開(kāi)發(fā)工具本章目標(biāo)任何應(yīng)用程序的開(kāi)發(fā)都離不開(kāi)編輯器、編譯器及調(diào)試器,嵌入式Linux 的C
    發(fā)表于 11-01 17:38 ?12次下載
    <b class='flag-5'>嵌入式</b>linux <b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言</b>,<b class='flag-5'>嵌入式</b>LinuxC<b class='flag-5'>語(yǔ)言</b>開(kāi)發(fā)工具.pdf

    嵌入式為什么選擇C語(yǔ)言作為開(kāi)發(fā)語(yǔ)言

    了解嵌入式開(kāi)發(fā)的朋友們都非常的清楚其核心的開(kāi)發(fā)語(yǔ)言C語(yǔ)言,C語(yǔ)言
    發(fā)表于 11-03 14:06 ?15次下載
    <b class='flag-5'>嵌入式</b>為什么選擇<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>作為開(kāi)發(fā)<b class='flag-5'>語(yǔ)言</b>?

    C語(yǔ)言嵌入式培訓(xùn) 嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)

      學(xué)習(xí)嵌入式的基礎(chǔ)語(yǔ)言C語(yǔ)言,因此先掌握C語(yǔ)言對(duì)于后續(xù)
    發(fā)表于 11-03 21:06 ?32次下載
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>嵌入式</b>培訓(xùn)  <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>程序設(shè)計(jì)基礎(chǔ)

    嵌入式C語(yǔ)言知識(shí)總結(jié)

    1 嵌入式C語(yǔ)言總結(jié)從語(yǔ)法上來(lái)說(shuō)C語(yǔ)言并不復(fù)雜, 但編寫(xiě)優(yōu)質(zhì)可靠的嵌入式
    發(fā)表于 12-20 19:44 ?12次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>知識(shí)總結(jié)

    c語(yǔ)言嵌入式編程

    比較詳盡的嵌入式C語(yǔ)言解答和分析
    發(fā)表于 03-10 14:53 ?162次下載

    嵌入式C語(yǔ)言的結(jié)構(gòu)特點(diǎn)

    嵌入式開(kāi)發(fā)既有底層硬件的開(kāi)發(fā)又涉及上層應(yīng)用的開(kāi)發(fā),即涉及系統(tǒng)的硬件和軟件,C語(yǔ)言既具有匯編語(yǔ)言操作底層的優(yōu)勢(shì),又具有高級(jí)
    的頭像 發(fā)表于 11-24 16:16 ?674次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的結(jié)構(gòu)特點(diǎn)
    主站蜘蛛池模板: 色久天| 久久热在线视频精品店| 亚洲精品视频免费看| 教室眠催白丝美女校花| 在线免费观看国产| 免费乱理伦片在线观看夜| JEALOUSVUE成熟老师APP| 色 花 堂 永久 网站| 国产亚洲精品精品精品| 一个人看www| 男人插曲视频大全免费网站| 成人免费在线视频| 亚洲、国产综合视频| 久久国产精品免费A片蜜芽| 999人在线精品播放视频| 日韩大胆视频| 国产在线亚洲精品观看不卡| 在线视频 亚洲| 人妻夜夜爽99麻豆AV| 国产视频www| 中文字幕在线视频在线看| 青春草国产成人精品久久| 国产精品亚洲专区在线播放| 一区二区三区毛AAAA片特级| 欧美丰满白嫩bbxx| 国产精品涩涩涩视频网站| 有人有片的观看免费视频| 漂亮的av女演员| 国产网址在线观看| 1级午夜影院费免区| 色琪琪久久热在线| 精品久久伦理中文字幕| aaaaaaa一级毛片| 亚欧乱亚欧乱色视频| 萝莉御姐被吸奶| 国产 有码 无码 电影| 伊人久久免费| 日韩美一区二区| 九九国产精品成人AV麻豆| 办公室沙发口爆12P| 亚洲欧美另类无码专区|