好久沒開文章了,有點(diǎn)手生,小伙伴們周末好,今天給大家分享一下宏定義,原本以為是很簡(jiǎn)單的小知識(shí)點(diǎn),最近在別人的構(gòu)架里發(fā)現(xiàn)看不懂了,發(fā)現(xiàn)了新大陸,必須拿來分享一下,首先來一下我們經(jīng)常用到的宏定義,經(jīng)常把常數(shù)定義成一個(gè)宏,如下:
#define MY_FIRST_MACRO 1 //(非常簡(jiǎn)單吧)
接下來看看最近我在分析QF框架時(shí)的境遇吧,對(duì)于QF來講,因?yàn)樗鰰r(shí)間管理,所以需要一個(gè)QF_tick()處理,隨便打開了一個(gè)bsp.c如下:
第一眼看上去他應(yīng)該是函數(shù)吧,我們跟進(jìn)去看一下定義是啥:
我的天,他居然是一個(gè)宏,他居然不大寫。。??匆幌潞竺娲髮懙哪莻€(gè)家伙:
他居然是個(gè)函數(shù),注意他居然是個(gè)全大寫的函數(shù),驚不驚喜意不意外,接下來我們作者為啥要這么干。
假如你一直都是些單片機(jī)軟件,你可能會(huì)非常的迷糊,為啥要搞得這么復(fù)雜的宏,這里直接告訴你答案,因?yàn)橐浦?,移植,移植,到不同的硬件平臺(tái)上去,作者寫的構(gòu)架是一個(gè)通用的產(chǎn)物,那么不光單片機(jī)能用,PC(Linux、windows)都要能用,才是他的目的。
假如換了多年前的我,我會(huì)想那么一個(gè)平臺(tái)一個(gè)bsp包多么簡(jiǎn)單,不用那么復(fù)雜的宏進(jìn)行替換,一眼到底多清爽,十幾個(gè)平臺(tái)就會(huì)有十幾個(gè)包,修改一點(diǎn)配置也要多一個(gè)包,他最終會(huì)膨脹到你無法想象的數(shù)量,所以兼容這個(gè)事情雖然難,也必須要做。
接下來我們總結(jié)一下宏,定義一個(gè)宏的目的,并不是讓你知道他是一個(gè)常量或者是一個(gè)函數(shù)、一段代碼,只是通過一個(gè)別名告訴你這段代碼是干什么用的,他的初衷并不是希望你單步跟進(jìn)去看看是怎么實(shí)現(xiàn)的,而是讓你對(duì)這段代碼整體的功能有個(gè)大體的理解。
宏不一定非要大寫,函數(shù)也不一定非要小寫,有些特殊的場(chǎng)景,我們需要忘掉那些腦袋中那些常規(guī)的套路。
也就是說一個(gè)宏,可以是一個(gè)常量,一段代碼或者一個(gè)函數(shù)等等。第二點(diǎn),宏定義用的是#define進(jìn)行定義,也就是說宏定義是一個(gè)預(yù)處理命令,他最終會(huì)在真正的編譯之前幫你配置出真正需要編譯的代碼,那個(gè)唯一配置的包。
最終作者希望達(dá)到的效果是,不管你有多少款板子,多少種配置,基于一個(gè)通用的SDK源碼包,通過簡(jiǎn)單的宏定義命令就可以組織出一個(gè)你想要的工程。