我在做專案時,發現很多開發者一般會建立一些名為constant.h、public.h的檔案,在這些檔案中定義大量的巨集。有字串常量、函式、方法等。字串常量,多是介面名、介面**、在使用nsuserdefaults時的key等等,這樣做的好處是,當介面**或介面名變更時,我們只需要更改constant檔案中的巨集,專案中對於這些字串常量一次就能修改完,不會有所遺漏。
常用的函式、方法,比如修改顏色的方法#define rgba(r, g, b, a) [uicolor colorwithred:r/255.0f green:g/255.0f blue:b/255.0f alpha:a]
、螢幕尺寸#define screen_width [uiscreen mainscreen].bounds.size.width
等等。
pch檔案(precompile prefix header file),也就是預編譯標頭檔案,其作用就是,方便你一次性匯入在多個檔案中同時用到的標頭檔案、巨集或者url位址等(全域性使用),可以有效的幫你節約時間,提高開發效率。我通常使用pch引入常用的標頭檔案,比如上面提到的constant.h、public.h,還有一些常用三方sdk標頭檔案等等。關於pch,我看到的下面這個**的教程非常詳細,在這裡就不過多描述了。pch教程鏈結
const與巨集的區別,從四個方面來記編譯時刻 巨集:預編譯; const:編譯
編譯檢查 巨集:沒有編譯檢查; const:有編譯檢查
巨集的好處 巨集:可以定義函式、方法; const:不行
巨集的壞處 巨集:大量使用巨集,會導致預編譯時間過長
首先,解釋下預編譯,專案編譯時,如下圖所示,會有個藍色的進度條,這就是在預編譯。如果使用過多的巨集,這個進度條就會異常緩慢。編譯檢查,如下圖所示,巨集不會編譯檢查,而const會編譯檢查很多blog都說使用巨集,會消耗很多記憶體 , 巨集定義的是常量,常量都放在常量區,只會生成乙份記憶體。我通過下面的**驗證並不會消耗很多記憶體。如下圖所示,使用同乙個巨集,位址都是相同的。而且,定義完巨集都是直接用的,我想沒有人會先定義個變數,將巨集賦值給變數,再去用變數吧,這樣倒是會消耗許多記憶體……關於這裡還有一點,我感覺那些blog想表達的意思是,大量使用巨集,會導致預編譯時間過長……const的作用:修飾const右邊的基本變數(
int a
)或者指標變數(int *a
)被const修飾的變數是唯讀的
// const右邊修飾的是str1,str1是唯讀的,但是*str1可以修改
nsstring * const str1 = @"str1";
// const右邊修飾的是*str2,*str2是唯讀的,但是str2可以修改
nsstring
const *str2 = @"str2";
const使用場景修飾全域性變數
修飾方法中的引數
蘋果官方推薦用const定義全域性變數,而不是使用巨集。定義全域性變數使用const的意義在於,定義一些key時(比如在nsuserdefaults中使用的key),我們不想讓key隨意修改(在存值時用的key,未取值時先修改了key,結果key取不到值)。
// 蘋果官方不推薦使用巨集
// #define namekey @"namekey"
// 推薦使用const,const修飾的namekey是唯讀的,不能修改
nsstring * const namekey = @"namekey";
- (void)test:(int
const *)a
const用來修飾全域性變數,使全域性變數唯讀。 而static修飾全域性變數,修改全域性變數的作用域。我們定義乙個全域性變數來替代巨集,但是我們希望這個全域性變數僅僅作用在當前資料夾下,這時候就需要static來修飾了。static nsstring * const
key = @"key";
通常,我們需要將全域性變數全部定義在同乙個檔案下使用,這樣的好處在於方便管理,假如出現全域性變數重名的情況,會直接報錯,方便查詢錯誤。extern可以置於變數或者函式前,以表示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模組中尋找其定義。
// xx.h 檔案中實現宣告
extern
nsstring * const key;
// xx.m 檔案中實現賦值
nsstring * const key = @"lemontree";
巨集與巨集病毒 學習筆記
巨集病毒word巨集病毒 若對巨集或巨集病毒有一定了解可直接跳轉於此 經典巨集病毒 參考文獻 近日,在某個技術 上看到了一篇關於巨集病毒的技術部落格,並且在幾個月前在虛擬機器上做了乙個簡單的巨集病毒實驗,但並未認真研究過其原理,今天忽然有了一點莫名的興致,藉著這個莫名而來的興趣研究了下巨集和巨集病毒...
學習筆記 巨集定義基礎
在c c 中,巨集定義是由define完成的。define f a,b a b define g a a define h a g a f 1,2 輸出 12 輸出格式為 d 若為 s則報錯 g f 1,2 輸出 f 1,2 輸出格式 s h f 1,2 輸出 12 輸出格式 s 最外層巨集可替換至...
C 巨集的學習筆記
c c 中巨集總結c程式的源 中可包括各種編譯指令,這些指令稱為預處理命令。雖然它們實際上不是c語言的一部分,但卻擴充套件了c程 序設計的環境。本節將介紹如何應用預處理程式和注釋簡化程式開發過程,並提高程式的可讀性。ansi標準定義的c語言預處理程式包括下列命令 define,error,i ncl...