iOS開發之巨集深度學習

2021-06-25 16:40:50 字數 1353 閱讀 2279

巨集定義在c系開發中可以說占有舉足輕重的作用。底層框架自不必說,為了編譯優化和方便,以及跨平台能力,巨集被大量使用,可以說底層開發離開define將寸步難行。而在更高層級進行開發時,我們會將更多的重心放在業務邏輯上,似乎對巨集的使用和依賴並不多。但是使用巨集定義的好處是不言自明的,在節省工作量的同時,**可讀性大大增加。 如果想成為乙個能寫出漂亮優雅**的開發者,巨集定義絕對是必不可少的技能(雖然巨集本身可能並不漂亮優雅xd)。但是因為巨集定義對於很多人來說,並不像業務邏輯那樣是每天會接觸的東西。即使是能偶爾使用到一些巨集,也更多的僅僅只停留在使用的層級,卻並不會去探尋背後發生的事情。 有一些開發者確實也有探尋的動力和意願,但卻在點開乙個定義之後發現還有巨集定義中還有其他無數定義,再加上滿螢幕都是不同於平時的**,既看不懂又不變色,於是乎心生煩惱,怒而回退。本文希望通過循序漸進的方式,通過幾個例子來表述c系語言巨集定義世界中的一些基本規則和技巧,從0開始,希望最後能讓大家至少能看懂和還原一些相對複雜的巨集。考慮到我自己現在objc使用的比較多,這個站點的讀者應該也大多是使用objc的,所以有部分例子是選自objc,但是本文的大部分內容將是c系語言通用。

入門如果您完全不知道巨集是什麼的話,可以先來熱個身。很多人在介紹巨集的時候會說,巨集嘛很簡單,就是簡單的查詢替換嘛。嗯,只說對了的一半。c中的巨集分為兩類,物件巨集(object-like macro)和函式巨集(function-like macro)。對於物件巨集來說確實相對簡單,但卻也不是那麼簡單的查詢替換。

物件巨集一般用來定義一些常數,#define關鍵字表明即將開始定義乙個巨集,緊接著的m_pi是巨集的名字,空格之後的數字是內容。類似這樣的#define x a的巨集是比較簡單的,在編譯時編譯器會在語義分析認定是巨集後,將x替換為a,這個過程稱為巨集的展開。

函式巨集顧名思義,就是行為類似函式,可以接受引數的巨集。在定義的時候,如果我們在巨集名字後面跟上一對括號的話,這個巨集就變成了函式巨集,相比物件巨集來說,函式巨集要複雜一些,但是看起來也相當簡單。現在熱身結束,讓我們正式開啟巨集的大門。

巨集的世界,小有乾坤因為巨集展開其實是編輯器的預處理,因此它可以在更高層級上控制程式原始碼本身和編譯流程。而正是這個特點,賦予了巨集很強大的功能和靈活度。但是凡事都有兩面性,在獲取靈活的背後,是以需要大量時間投入以對各種邊界情況進行考慮來作為代價的。可能這麼說並不是很能讓人理解,但是大部分巨集(特別是函式巨集)背後都有一些自己的故事,挖掘這些故事和設計的思想會是一件很有意思的事情。另外,我一直相信在實踐中學習才是真正掌握知識的唯一途徑,雖然可能正在看這篇博文的您可能最初並不是打算親自動手寫一些巨集,但是這我們不妨開始動手從實際的書寫和犯錯中進行學習和挖掘,因為只有肌肉記憶和大腦記憶協同起來,才能說達到掌握的水準。可以說,寫巨集和用巨集的過程,一定是在在犯錯中學習和深入思考的過程,我們接下來要做的,就是重現這一系列過程從而提高進步。

源部落格:

iOS之開發常用巨集

字串是否為空 define kstringisempty str str iskindofclass nsnull class str nil str length 1 yes no 陣列是否為空 define karrayisempty array array nil array iskindof...

IOS開發常用巨集

字串是否為空 define kstringisempty str str iskindofclass nsnull class str nil str length 1 yes no 陣列是否為空 define karrayisempty array array nil array iskindof...

iOS開發常用巨集

大家都是知道使用巨集不僅方便,而且可以提高開發效率。下面總結了ios開發過程中的一些常用巨集,會持續的往裡面新增。字串是否為空 define kstringisempty str str iskindofclass nsnull class str nil str length 陣列是否為空 def...