有些時候,一些原本的函數功能可能並不是我們想要的,於是就想著修改函數,或者再封裝一層函數。
比如對一個函數包裝:
列印效果如下:
每列印一個 hello 前面都會增加一個 add。
這樣確實能達到效果,但是因為多調用了一次函數,所以性能會部分下降,同時需要更大的棧空間,那麼是否有一種更好的方式去達到相同的目的呢?
有的,那就是使用宏進行偷梁換柱,達到狸貓換太子的目的。
我們以列印函數為例,對它進行偷梁換柱。
一般的列印函數只會列印我們輸入給它的參數,卻無法列印額外的信息,比如時間戳、函數名、文件名、行號等。簡單一點,假如我們希望在列印我們的消息前,能添加時間戳和函數名,又該如何做呢?
簡單且易理解的偷梁換柱如下:
原本我們的代碼裡面使用的是 printf 進行列印,但自己比較懶,不想每次換平臺的時候都修改列印函數(比如RT-Thread 使用 rt_kprintf 列印),或者怕替換的時候操作失誤,那麼此時就可以使用這個技巧了。
我們先定義出我們自己的列印格式(關於這個,魚鷹會專門寫一篇筆記介紹如何設計一個簡單實用的日誌列印框架,裡面會詳細介紹這些內容,目前暫時拿來用就行),這個格式包含了時間戳信息、函數名信息。
之後,使用 define重新定義 printf。
也就是說,34;hello,Osprey&undef 和 undef 取消了 rt_kprintf 的定義,而 #define 又重新定義了 rt_kprintf,所以接下來的:
被替換成了 :
因為 rt_kprintf函數已經有了,最後編譯、連結的時候也能順利通過了,爽!
當然,有時候版本發布的時候,我們發現不再需要列印函數了,那麼我們只要使用如下方式即可消除列印(文件開頭添加即可):
這個騷操作,你學會了嗎?
喜歡的話,記得關注,每周一更