在過去開發(fā)中,幾乎每一個人都會定義宏,因為這東西實在是好用,省去了代碼量而且還不容易錯,而我這篇文中所介紹的const可以完美替帶宏定義.
并且蘋果也建議大家拋棄宏定義而轉(zhuǎn)投const ,并且swift里壓根就沒有宏定義這么一說,所以為了方便我們以后的開發(fā),還是盡早棄暗投明的好 .
進入正題我們先來說說,
- const與宏的區(qū)別:
(1)執(zhí)行時刻:宏是預(yù)編譯(編譯之前處理),const是編譯階段。
(2)編譯檢查:宏不做檢查,不會報編譯錯誤,只是替換,const會編譯檢查,會報編譯錯誤。
(3)宏可以定義一些函數(shù),方法。 const不能。
(這里需要證實一點,宏不會開辟新的內(nèi)存空間 ,而是存放在常量區(qū),也就是正常使用并不會造成內(nèi)存暴漲 ).
- const與宏的區(qū)別:
2.const作用:限制類型
(1)const僅僅用來修飾右邊的變量(可以是基本數(shù)據(jù)變量p,也可以是指針變量*p)
(2).被const修飾的變量是只讀的。
3.const的具體用法
只要記住一句話const只修飾右邊最近的基本變量示例: const:修飾基本變量p , 這里有兩種寫法并且意義相同
const int b =20;
int const b =20;
這里b是只讀變量不允許修改值 .需要注意下面兩句的區(qū)
const修飾指針常量
int const *p1; 則 *p1:常量(不可變) p1:變量(可變)
const修飾指針變量
int *const p; 則*p1:變量 p1:常量(不可變)
從上面看來,const的定義區(qū)間就一目了然了 ,只要看它后面跟的是否為指針,是則指針的指向就是不可改變的, 如果后面是變量則變量的值不可修改.4.static與const聯(lián)合使用
static與const作用:
(1)聲明一個只讀的靜態(tài)變量
那么為什么要改變?nèi)肿兞孔饔糜?,主要是為了防止重?fù)聲明全局變量。 在開發(fā)中聲明的全局變量,有些不希望外界改動,只允許讀取。這時就需要兩者一起使用.
(2) 聲明一個靜態(tài)的全局只讀常量比如一個基本數(shù)據(jù)類型不希望別人改動則可使用static const int a = 10;
(3)也可以用來代替宏,把一個經(jīng)常使用的字符串常量,定義成靜態(tài)全局只讀變量.
(4)開發(fā)中經(jīng)常拿到key修改值,因此用const修飾key,表示key只讀,不允許修改。
static NSString * const key = @"name";
static NSString const *key1 = @"name";
現(xiàn)在應(yīng)該也可以分清這兩句的區(qū)別了吧!5.extern與const聯(lián)合使用 VS static與const聯(lián)合使用
(1) static與const組合:只能在本文件中使用,如果多個文件同時使用,需要在每個文件都需要定義一份靜態(tài)全局變量。
(2) extern與const組合:在多個文件中經(jīng)常使用的同一個字符串常量,可以使用extern與const組合。如果你需要一個全局變量就可以選擇
extern NSString * const key = @"name";
extern NSString const *key1 = @"name";
雖然這種做法很方便,但是如果多人開發(fā)可能會出現(xiàn)大家定義沖突,所以建議
通常搞一個文件,里面專門定義全局變量,統(tǒng)一管理,就可以避免定義沖突的情況了 .