#和##對(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:
輸出結(jié)果:
從結(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í)例就明白了。
輸出結(jié)果:
這樣的話就不需要總是采用雙引號(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ì)編寫了如下代碼:
暗自歡喜的編譯著,然而卻得到了如下結(jié)果:
得到的并不是拼接以后你想要的uart1,難道不能這么玩?當(dāng)然不是,不然也不會(huì)在這里拿出來說 。首先要知道原因 : 進(jìn)行宏定義嵌套的情況,#或者##僅在當(dāng)前宏有效,嵌套宏中不會(huì)再次展開,既然當(dāng)前宏無法展開,那么我只能再加一級(jí)宏定義作為轉(zhuǎn)換宏進(jìn)行展開,看能不能解決該問題:
此時(shí)輸出的結(jié)果符合我們的預(yù)期:
首先進(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ù)的代碼。比如下面的參考代碼 :
2、統(tǒng)一宏替換
拼接標(biāo)識(shí)符意味著符號(hào)的粒度更高,而這碎片化的符號(hào)進(jìn)行有效的管理,就可以使得符號(hào)更加具有通用性和靈活性。其實(shí)這種思想跟我們代碼模塊話是同樣的道理。來首先我們用一個(gè)兩層拼接體驗(yàn)一下:
編寫的思路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ù)雜度,合理利用即可~
審核編輯:劉清
-
C語言
+關(guān)注
關(guān)注
180文章
7632瀏覽量
141731 -
uart
+關(guān)注
關(guān)注
22文章
1276瀏覽量
103945 -
字符串
+關(guān)注
關(guān)注
1文章
590瀏覽量
22278
發(fā)布評(píng)論請(qǐng)先 登錄
SlaveFifo 2bit sync模式下最大速度只有320Mbyte/s左右,還能更快一點(diǎn)嗎?
用LMP91200采集PH信號(hào),LMP91200輸出的電壓會(huì)一點(diǎn)一點(diǎn)下降,是什么原因?qū)е碌模?/a>
救助,定義一個(gè)大一點(diǎn)的數(shù)組導(dǎo)致編譯不通過問題。
云數(shù)據(jù)庫和云主機(jī)哪個(gè)好一點(diǎn)?
光纖外面的皮破了一點(diǎn)有關(guān)系嗎
讓單片機(jī)代碼性能起飛的七大技巧

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

TPA3255音量稍微大一點(diǎn)就會(huì)保護(hù),需要重新啟動(dòng),怎么解決?
大功率貼片電感的電感值偏大一點(diǎn)可以用嗎
OPA2228在分壓之后的一點(diǎn)信號(hào)就出現(xiàn)了失真,為什么?
代碼整潔之道-大師眼中的整潔代碼是什么樣

評(píng)論