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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

#和##寫出“秀”一點的代碼

冬至配餃子 ? 來源:最后一個bug ? 作者:bug菌 ? 2022-08-11 17:44 ? 次閱讀

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

但是今天還是想重新介紹這兩個“兄弟”,希望大家能夠寫出"秀"一點的代碼~

1、#和##基礎

對于這兩個語法的功能都比較簡單,且都是在

預處理階段

做一些工作 :

#主要是將宏參數轉化為字符串

##主要是將兩個標識符拼接成一個標識符

沒點代碼似乎并不是那么形象 :

參考demo:

pYYBAGL0zluACYjNAADPq4hIo50851.png

輸出結果:

poYBAGL0zm2AVtyJAAAmcrg7hqI889.png

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

2、#的玩法

1、標識符的“字符串變量"

“#”一般結合打印語句組合成一個宏定義,可以方便的打印相關信息,下面給個簡單的實例就明白了。

poYBAGL0zoGADIkhAADSeljeKRQ791.png

輸出結果:

poYBAGL0zpiAFJ5ZAAAtJvQj9fg944.png

這樣的話就不需要總是采用雙引號來單獨書寫,同時你還可以繼續擴展構造更加靈活的宏。2、結合##進行字符串拼接打印前面介紹了##進行標識符的拼接,那么實現拼接標識符轉化為字符串看來很簡單吧,于是你會編寫了如下代碼:

poYBAGL0zqqAfcaQAACGvTONuOs330.png

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

poYBAGL0zrqAYk3ZAAAWu9H8nAY063.png

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

poYBAGL0zsuAKj0PAACb6YBeaEw850.png

此時輸出的結果符合我們的預期:

poYBAGL0ztyAORLuAAAamuC2BLc556.png

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

3、##的玩法

##拼接符的玩法有點多,甚至有些還比較繞,當然如果你游刃有余的話,這對于重構代碼是一把“ 利器 ”。

1、在結構體定義中的妙用

下面是bug菌經常在項目代碼中用到的##結構體定義法,也是非常多開源代碼中慣用的做法,相比常規的結構體定義法,確實省去很多重復的代碼。比如下面的參考代碼 :

poYBAGL0zvKAQ-U1AADbGFWhUxI580.png

2、統一宏替換

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

pYYBAGL0zxWAdqXPAAHsk2LPMp4853.png

poYBAGL0zxuAed17AAALIYngyf0601.png

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


審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137408
  • uart
    +關注

    關注

    22

    文章

    1243

    瀏覽量

    101627
  • 字符串
    +關注

    關注

    1

    文章

    585

    瀏覽量

    20577
收藏 人收藏

    評論

    相關推薦

    救助,定義個大一點的數組導致編譯不通過問題。

    本例使用 CSU-IDE V6.0.6 ,單片機為CSU38F20,發現在改大數組的時候編譯不通過,請各位大神指教。具體問題描述如下: 正常情況: 串口收發緩沖區定義小一點沒有問題,如下
    發表于 01-01 15:43

    云數據庫和云主機哪個好一點

    云數據庫和云主機哪個好一點?云主機和云數據庫各有優勢,選擇哪個更好取決于具體需求。云主機提供虛擬化的計算資源,適用于運行各種應用;而云數據庫專注于數據存儲和管理,適合高效數據處理。兩者都具有高性能
    的頭像 發表于 12-04 13:50 ?169次閱讀

    光纖外面的皮破了一點有關系嗎

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

    讓單片機代碼性能起飛的七大技巧

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

    如何寫出穩定的單片機代碼

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

    TPA3255音量稍微大一點就會保護,需要重新啟動,怎么解決?

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

    大功率貼片電感的電感值偏大一點可以用嗎

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

    OPA2228在分壓之后的一點信號就出現了失真,為什么?

    我使用OPA2228雙運放,其中個運放做THS5651的輸出I-V轉換,將該電壓信號經過電阻分壓衰減送進另個運放組成的射極跟隨器,但是測到在進入分壓前沒有問題,但是在分壓之后的一點信號就出現了失真,請問是什么原因,如何解決
    發表于 09-20 08:03

    電感碎了一點點能正常用嗎

    電子發燒友網站提供《電感碎了一點點能正常用嗎.docx》資料免費下載
    發表于 09-04 11:32 ?0次下載

    發電機轉子一點接地如何處理

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

    BLDC橋驅動的兩端都會并聯很大的電容和個小一點的電容,這個電容是必須的嗎?

    官方出的關于bldc電機控制的開發板,橋驅動的兩端都會并聯很大的電容和個小一點的電容,這個電容是必須的嗎? 是否可以去掉? 希望得到回復,謝謝!
    發表于 07-04 07:15

    ESP32C3燒錄fast_scan的例程代碼,怎么一點東西都沒有顯示的?

    最近研究ESP32C3的WIFI 部分,燒錄fast_scan的例程代碼,怎么一點東西都沒有顯示的?只是顯示了ESP32的MAC地址?什么東西都沒有顯示或者動作了?我是不是要在menuconfig設置某些東西才能掃描AP?還是要在程序里面設置?望指點?
    發表于 06-17 06:08

    請問ARM Cortex系列燒寫器哪個燒寫快一點

    最近個工程文件有點大,用STLink燒寫需要40多秒,CMSIS-CAP燒寫需要30秒左右,jlink沒試過,我還知道用帶USB的Bootloader進行flash燒寫的,但不知道哪個燒寫快一點,請問大家都在使用什么燒寫器呢?
    發表于 05-10 06:15

    使用stm32cubeprogrammer下程序總閃退,一點\"start programm\" 就退出怎么解決?

    使用stm32cubeprogrammer 下程序總閃退,連接是正常的,一點\"start programm\" 就退出。
    發表于 03-28 08:25

    如何寫出時序最優的HDL代碼?如何寫出時序裕量足夠的代碼

    你想寫出可以跑出700M以上的代碼嗎,直逼FPGA內部PLL的極限。
    的頭像 發表于 03-12 09:59 ?957次閱讀
    如何<b class='flag-5'>寫出</b>時序最優的HDL<b class='flag-5'>代碼</b>?如何<b class='flag-5'>寫出</b>時序裕量足夠的<b class='flag-5'>代碼</b>?
    主站蜘蛛池模板: 补课H湿 1V1 PLAY| chinesevideoshd性舞| 日本精品久久久久中文字幕2| 久久亚洲这里只有精品18| 国内精品偷拍在线观看| 国产成人免费手机在线观看视频| 成人AV精品视频| 爆操日本美女| 边做边爱免费视频| 插曲的痛30分钟视频最新章节| ai换脸女明星被躁在线观看免费| 97caopeng| 99re6在线视频国产精品欧美| 97SE亚洲国产综合在线| 97SE亚洲国产综合自在线不卡 | 国产69精品久久久久无码麻豆| 憋尿调教绝望之岛| 成人天堂婷婷青青视频在线观看| 超碰人人澡人人胔| 高清国产一区| 国产精品A久久777777| 国产精品一区二区人妻无码| 国产又粗又猛又爽又黄的免费视频| 国产专区亚洲欧美另类在线| 教室里的激情电影| 久久精品免费看网站| 快播电影频道| 男人边吃奶边挵进去呻吟漫画| 欧美同志高清vivoeso| 人人超碰97caoporen国产| 色婷婷综合激情中文在线| 午夜男女爽爽羞羞影院在线观看| 亚洲国产欧美在线人成aaaa20| 怡春院欧美一区二区三区免费| 中国成人在线视频| av56788成 人影院| 高清撒尿hdtube撒尿| 国产亚洲精品97在线视频一| 久久机热免费视频| 女性性纵欲派对| 色www精品视频在线观看|