99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

#和##寫出“秀”一點(diǎn)的代碼

冬至配餃子 ? 來源:最后一個(gè)bug ? 作者:bug菌 ? 2022-08-11 17:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

#和##對(duì)于大部分C語言玩得還算比較溜的朋友并不是很陌生,不過能把這兩個(gè)知識(shí)點(diǎn)游刃有余的應(yīng)用到所在代碼中的每個(gè)角落,似乎并沒有幾個(gè)人能夠做到,學(xué)的時(shí)候朗朗上口,而編碼的時(shí)候卻拋之腦后。

但是今天還是想重新介紹這兩個(gè)“兄弟”,希望大家能夠?qū)懗?秀"一點(diǎn)的代碼~

1、#和##基礎(chǔ)

對(duì)于這兩個(gè)語法的功能都比較簡(jiǎn)單,且都是在

預(yù)處理階段

做一些工作 :

#主要是將宏參數(shù)轉(zhuǎn)化為字符串

##主要是將兩個(gè)標(biāo)識(shí)符拼接成一個(gè)標(biāo)識(shí)符

沒點(diǎn)代碼似乎并不是那么形象 :

參考demo:

pYYBAGL0zluACYjNAADPq4hIo50851.png

輸出結(jié)果:

poYBAGL0zm2AVtyJAAAmcrg7hqI889.png

從結(jié)果上看來似乎#僅僅只是代替了字符串的雙引號(hào),而##卻實(shí)現(xiàn)了標(biāo)識(shí)符的拼接,這樣就為編碼標(biāo)識(shí)符的處理上能夠帶來更多的可玩性。那么,下面bug菌跟大家具體展示一下他們的常用技巧:

2、#的玩法

1、標(biāo)識(shí)符的“字符串變量"

“#”一般結(jié)合打印語句組合成一個(gè)宏定義,可以方便的打印相關(guān)信息,下面給個(gè)簡(jiǎn)單的實(shí)例就明白了。

poYBAGL0zoGADIkhAADSeljeKRQ791.png

輸出結(jié)果:

poYBAGL0zpiAFJ5ZAAAtJvQj9fg944.png

這樣的話就不需要總是采用雙引號(hào)來單獨(dú)書寫,同時(shí)你還可以繼續(xù)擴(kuò)展構(gòu)造更加靈活的宏。2、結(jié)合##進(jìn)行字符串拼接打印前面介紹了##進(jìn)行標(biāo)識(shí)符的拼接,那么實(shí)現(xiàn)拼接標(biāo)識(shí)符轉(zhuǎn)化為字符串看來很簡(jiǎn)單吧,于是你會(huì)編寫了如下代碼:

poYBAGL0zqqAfcaQAACGvTONuOs330.png

暗自歡喜的編譯著,然而卻得到了如下結(jié)果:

poYBAGL0zrqAYk3ZAAAWu9H8nAY063.png

得到的并不是拼接以后你想要的uart1,難道不能這么玩?當(dāng)然不是,不然也不會(huì)在這里拿出來說 。首先要知道原因 : 進(jìn)行宏定義嵌套的情況,#或者##僅在當(dāng)前宏有效,嵌套宏中不會(huì)再次展開,既然當(dāng)前宏無法展開,那么我只能再加一級(jí)宏定義作為轉(zhuǎn)換宏進(jìn)行展開,看能不能解決該問題:

poYBAGL0zsuAKj0PAACb6YBeaEw850.png

此時(shí)輸出的結(jié)果符合我們的預(yù)期:

poYBAGL0ztyAORLuAAAamuC2BLc556.png

首先進(jìn)行第一層轉(zhuǎn)換宏替換處理掉##拼接符得到str(uart1),然后進(jìn)行字符串轉(zhuǎn)換符的處理為uart1字符串打印輸出,當(dāng)然以后你會(huì)遇到一些復(fù)雜的,不過要訣就是宏替換只會(huì)處理當(dāng)前的#或者##,否則就需要增加轉(zhuǎn)換宏提前進(jìn)行宏替換展開。所以采用##拼接出來的標(biāo)識(shí)符想要打印輸出的話,使用#進(jìn)行轉(zhuǎn)換是最直接、方便的。

3、##的玩法

##拼接符的玩法有點(diǎn)多,甚至有些還比較繞,當(dāng)然如果你游刃有余的話,這對(duì)于重構(gòu)代碼是一把“ 利器 ”。

1、在結(jié)構(gòu)體定義中的妙用

下面是bug菌經(jīng)常在項(xiàng)目代碼中用到的##結(jié)構(gòu)體定義法,也是非常多開源代碼中慣用的做法,相比常規(guī)的結(jié)構(gòu)體定義法,確實(shí)省去很多重復(fù)的代碼。比如下面的參考代碼 :

poYBAGL0zvKAQ-U1AADbGFWhUxI580.png

2、統(tǒng)一宏替換

拼接標(biāo)識(shí)符意味著符號(hào)的粒度更高,而這碎片化的符號(hào)進(jìn)行有效的管理,就可以使得符號(hào)更加具有通用性和靈活性。其實(shí)這種思想跟我們代碼模塊話是同樣的道理。來首先我們用一個(gè)兩層拼接體驗(yàn)一下:

pYYBAGL0zxWAdqXPAAHsk2LPMp4853.png

poYBAGL0zxuAed17AAALIYngyf0601.png

編寫的思路bug菌在代碼中跟大家都標(biāo)注了,相信大家一眼就能看懂,似乎并沒有想象中那么難。而在前面介紹##的基礎(chǔ)知識(shí)提過,只要轉(zhuǎn)換宏寫得夠多,你可以一層套一層,最終獲得你想要的標(biāo)識(shí)符,達(dá)到修改一個(gè)簡(jiǎn)單的宏即可替換一整套宏的效果。所以關(guān)鍵還是你要清晰的把拼接變量找出來,bug菌這里僅展示了一個(gè)拼接變量,當(dāng)然多個(gè)也是同樣沒有問題的,跟我們函數(shù)傳遞參數(shù)一樣,不過這樣也會(huì)增加整個(gè)替換的復(fù)雜度,合理利用即可~


審核編輯:劉清

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

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141731
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1276

    瀏覽量

    103945
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    590

    瀏覽量

    22278
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    SlaveFifo 2bit sync模式下最大速度只有320Mbyte/s左右,還能更快一點(diǎn)嗎?

    也只有320Mbyte/s左右,還能更快一點(diǎn)嗎?怎么優(yōu)化。希望超過400MB/s。我只需要個(gè)讀,個(gè)寫線程即可。其他線程資源可以關(guān)閉掉該如何關(guān)閉。 是不是定要采用GPIF II那種
    發(fā)表于 05-06 14:36

    12位串行AD好用一點(diǎn)的有哪些介紹的?

    12位串行AD好用一點(diǎn)的有哪些介紹的
    發(fā)表于 02-06 07:05

    用LMP91200采集PH信號(hào),LMP91200輸出的電壓會(huì)一點(diǎn)一點(diǎn)下降,是什么原因?qū)е碌模?/a>

    我用LMP91200采集PH信號(hào)。在前段信號(hào)無變化的情況下,LMP91200輸出的電壓會(huì)一點(diǎn)一點(diǎn)下降。電路連接我是參考LMP91200開發(fā)板的。 請(qǐng)問可能是什么原因?需要采取什么措施解決?
    發(fā)表于 02-05 06:12

    救助,定義個(gè)大一點(diǎn)的數(shù)組導(dǎo)致編譯不通過問題。

    本例使用 CSU-IDE V6.0.6 ,單片機(jī)為CSU38F20,發(fā)現(xiàn)在改大數(shù)組的時(shí)候編譯不通過,請(qǐng)各位大神指教。具體問題描述如下: 正常情況: 串口收發(fā)緩沖區(qū)定義小一點(diǎn)沒有問題,如下
    發(fā)表于 01-01 15:43

    云數(shù)據(jù)庫和云主機(jī)哪個(gè)好一點(diǎn)?

    云數(shù)據(jù)庫和云主機(jī)哪個(gè)好一點(diǎn)?云主機(jī)和云數(shù)據(jù)庫各有優(yōu)勢(shì),選擇哪個(gè)更好取決于具體需求。云主機(jī)提供虛擬化的計(jì)算資源,適用于運(yùn)行各種應(yīng)用;而云數(shù)據(jù)庫專注于數(shù)據(jù)存儲(chǔ)和管理,適合高效數(shù)據(jù)處理。兩者都具有高性能
    的頭像 發(fā)表于 12-04 13:50 ?454次閱讀

    光纖外面的皮破了一點(diǎn)有關(guān)系嗎

    光纖外面的皮破了一點(diǎn),在般情況下,只要光纖的纖芯沒有受到損傷,對(duì)通信通常是沒有影響的。光纖的外皮主要起保護(hù)作用,能夠防止光纖受到機(jī)械損傷、腐蝕、潮濕等外部環(huán)境的損害。如果外皮破損,但纖芯仍然保持
    的頭像 發(fā)表于 11-25 10:04 ?2275次閱讀

    讓單片機(jī)代碼性能起飛的七大技巧

    單片機(jī)的程序比軟開少些,真正想編寫出高效的代碼,還是要積累很多年的。? ? ? ? ?? 在做研發(fā)工程師的10年里,我經(jīng)歷過幾個(gè)公司,看過很多工程師寫的代碼,但真正能讓我跪著看完的,
    的頭像 發(fā)表于 11-16 10:21 ?1147次閱讀
    讓單片機(jī)<b class='flag-5'>代碼</b>性能起飛的七大技巧

    如何寫出穩(wěn)定的單片機(jī)代碼

    這篇文章分享怎么寫出穩(wěn)定的單片機(jī)代碼。? ?? 我對(duì)優(yōu)秀代碼的理解,大體分為兩個(gè)部分:高效和穩(wěn)定。 ? 兩者都能做到很好的,如果靠自己摸索,沒有刻意去練習(xí),可能需要花10年,甚至更久
    的頭像 發(fā)表于 11-15 16:40 ?822次閱讀
    如何<b class='flag-5'>寫出</b>穩(wěn)定的單片機(jī)<b class='flag-5'>代碼</b>

    TPA3255音量稍微大一點(diǎn)就會(huì)保護(hù),需要重新啟動(dòng),怎么解決?

    經(jīng)過反復(fù)測(cè)3255 雙聲道模式2歐喇叭單元,音量稍微大一點(diǎn)就會(huì)保護(hù),需要重新啟動(dòng),4歐以上就沒有任何問題,這個(gè)情況供電超過36V 才明顯,尤其高壓50V左右,只要音量有一點(diǎn)就保護(hù)了。單聲道模式可以55V供電不保護(hù)。尋求解決辦法,調(diào)整電阻,電容,或者加粗銅箔走線,并沒有得
    發(fā)表于 09-30 08:32

    大功率貼片電感的電感值偏大一點(diǎn)可以用嗎

    電子發(fā)燒友網(wǎng)站提供《大功率貼片電感的電感值偏大一點(diǎn)可以用嗎.docx》資料免費(fèi)下載
    發(fā)表于 09-20 11:33 ?0次下載

    OPA2228在分壓之后的一點(diǎn)信號(hào)就出現(xiàn)了失真,為什么?

    我使用OPA2228雙運(yùn)放,其中個(gè)運(yùn)放做THS5651的輸出I-V轉(zhuǎn)換,將該電壓信號(hào)經(jīng)過電阻分壓衰減送進(jìn)另個(gè)運(yùn)放組成的射極跟隨器,但是測(cè)到在進(jìn)入分壓前沒有問題,但是在分壓之后的一點(diǎn)信號(hào)就出現(xiàn)了失真,請(qǐng)問是什么原因,如何解決
    發(fā)表于 09-20 08:03

    代碼整潔之道-大師眼中的整潔代碼是什么樣

    幾個(gè)月前寫了篇文章“如何寫出難以維護(hù)的代碼”,從中能大概了解到不好維護(hù)的代碼是什么樣,有哪些壞味道,那肯定有人會(huì)反問,難以維護(hù)的代碼見的太
    的頭像 發(fā)表于 09-09 16:30 ?651次閱讀
    <b class='flag-5'>代碼</b>整潔之道-大師眼中的整潔<b class='flag-5'>代碼</b>是什么樣

    電感碎了一點(diǎn)點(diǎn)能正常用嗎

    電子發(fā)燒友網(wǎng)站提供《電感碎了一點(diǎn)點(diǎn)能正常用嗎.docx》資料免費(fèi)下載
    發(fā)表于 09-04 11:32 ?0次下載

    發(fā)電機(jī)轉(zhuǎn)子一點(diǎn)接地如何處理

    故障原因分析 發(fā)電機(jī)轉(zhuǎn)子一點(diǎn)接地故障的原因主要有以下幾種: 1.1 機(jī)械損傷 發(fā)電機(jī)轉(zhuǎn)子在運(yùn)行過程中,由于振動(dòng)、摩擦等原因,可能導(dǎo)致轉(zhuǎn)子繞組的絕緣層受到損傷,從而引發(fā)接地故障。 1.2 絕緣老化
    的頭像 發(fā)表于 08-20 17:05 ?3492次閱讀

    怎么樣可以使THS3491的輸出波形的頂?shù)撞康牟▌?dòng)小一點(diǎn)呢?

    您好,怎么樣可以使THS3491的輸出波形的頂?shù)撞康牟▌?dòng)小一點(diǎn)呢?輸入信號(hào)的幅值為0-1V,圖1為電路連接圖,圖2為輸出波形。 圖1 圖2
    發(fā)表于 08-02 06:58