C/C++編程筆記:C語言被人遺忘的運(yùn)算符,了解三點(diǎn)即可掌握!
前言
本文主要介紹的是C語言中被人遺忘的運(yùn)算符"## ",這是很多學(xué)習(xí)C語言的人基本都沒有用過的一個(gè)知識(shí),希望對(duì)于廣大讀者學(xué)習(xí)C語言有一些幫助,深入了解C語言小知識(shí)

"##"的官方用法
它本質(zhì)上是一個(gè)“膠水運(yùn)算”,用于把參數(shù)宏中的“形參”與其它沒有天然分割的內(nèi)容粘連在一起,##就是個(gè)粘合劑,將前后兩部分粘合起來,也就是有“字符化”的意思。但是“##”不能隨意粘合任意字符,必須是合法的C語言標(biāo)示符。在單一的宏定義中,最多可以出現(xiàn)一次“#”或“##”預(yù)處理操作符。如果沒有指定與“#”或“##”預(yù)處理操作符相關(guān)的計(jì)算次序,則會(huì)產(chǎn)生問題。為避免該問題,在單一的宏定義中只能使用其中一種操作符(即,一份“#”或一個(gè)“ ## ”,或都不用)。例如:

實(shí)際中,我們想要定義不同的數(shù)組可以這樣直接這樣使用:
defArray(Tel,13);
//宏展開就是:
//charuserTel[13];
"## "的騷操作之不限參宏定義
可變參數(shù)宏的基礎(chǔ)知識(shí):
"..."只能放在參數(shù)宏形參列表的最后;
當(dāng)用戶的參數(shù)個(gè)數(shù)超過了規(guī)定的參數(shù)個(gè)數(shù)時(shí),所有多出來的內(nèi)容會(huì)一股腦的由“__VA_ARGS__”所背負(fù);
當(dāng)用戶的參數(shù)個(gè)數(shù)正好等于形參的個(gè)數(shù)時(shí),"__VA_ARGS__"就等效于一個(gè)空字符串
案例展示:

當(dāng)我們使用參數(shù)宏的時(shí)候在括號(hào)里不填寫任何內(nèi)容,最終會(huì)展開為僅有默認(rèn)值的10的情況,即:
result()的展開是(10)
當(dāng)我們提供了任意的有效值時(shí),則會(huì)被展開成逗號(hào)表達(dá)式,result(逗號(hào)表達(dá)式) 展開為(逗號(hào)表達(dá)式);所以result(10)為(10) result(1,2,3,4) 展開為(1,2,3,4);
"## "的騷操作之C缺省宏函數(shù)實(shí)現(xiàn)
這個(gè)技巧其實(shí)對(duì)API的封裝特別有效,它允許我們簡化函數(shù)API的使用,比如在用戶忽略的情況下,自動(dòng)給函數(shù)填充某些默認(rèn)值,而在用戶主動(dòng)提供參數(shù)的情況下,替代那些默認(rèn)值。類似于C++中的函數(shù)缺省思想。
假設(shè)我們有一個(gè)初始化函數(shù),初始化函數(shù)允許用戶通過結(jié)構(gòu)體來配置一些參數(shù):
typedefstructdataInfo{
...
} data;
intinitData(data* ptr);
為了簡化用戶的配置過程,初始化函數(shù)會(huì)檢查指針ptr是否為NULL,如果為NULL則自動(dòng)使用默認(rèn)配置,反之將使用用戶定義的配置。此時(shí),我們可以通過宏來提供默認(rèn)值NULL:

"## "的騷操作之消息處理的默認(rèn)配置
有些消息處理函數(shù)可以批量的處理某一類消息,而具體選中了哪些消息類別,則通常由二進(jìn)制掩碼來表示,此時(shí)我們完全可以借助宏來構(gòu)建一套語法糖,例如:

通過宏 add_msg 我們注意到,當(dāng)用戶刻意省略設(shè)置msk時(shí),我們就給出默認(rèn)值 0xFFFF——這很可能表示,在進(jìn)行消息處理的時(shí)候,消息必須嚴(yán)格匹配才能交給對(duì)應(yīng)的處理函數(shù);當(dāng)用戶指定 msk 時(shí),則可能表示某一類消息都交給同一個(gè)消息處理函數(shù)來處理。
希望對(duì)你有幫助~
自學(xué)C/C++編程難度很大,如果你想更快提升自己的編程能力和編寫項(xiàng)目的水平,歡迎一起共同成長!

另外,UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~