1肉拓、預(yù)處理定義常量
#define ElementSpacing16
通常會(huì)像上述定義常量后频。上述預(yù)處理命令會(huì)把源代碼中的 ElementSpacing 字符串替換成 16 。該預(yù)處理命令會(huì)把所有碰到的 ElementSpacing 全部替換成 16 暖途。如果該指令聲明在某個(gè)頭文件中卑惜,那么引入該頭文件的代碼,所有的 ElementSpacing 都會(huì)被替換驻售。
2残揉、static const extern
static const double kMargin = 10.0;
這樣定義常量包含的類型信息,好處:清楚的描述了常量的含義芋浮。變量一定要同時(shí)用 static 和 const 來聲明抱环,試圖修改 const 修飾的變量,編譯器就會(huì)報(bào)錯(cuò)纸巷;static 修飾的變量?jī)H在定義該變量的編譯單元中可見镇草,作用域就是該編譯單元,如果不用 static 修飾瘤旨,編譯器就會(huì)為該變量創(chuàng)建外部符號(hào)(external symbol)梯啤。如果其他編譯單元也聲明了該變量,編譯器就會(huì)報(bào)錯(cuò)存哲。
如果同時(shí)使用 static 和 const 聲明因宇,常量帶有類型信息。編譯器不會(huì)創(chuàng)建符號(hào)祟偷,會(huì)像#define預(yù)處理指令一樣察滑,把遇到的變量替換成常量值。
常用的命名方法:1.在實(shí)現(xiàn)文件之內(nèi) 采用 字母 k 開頭修肠;2.常量在類外部可見贺辰,通常以類名為前綴
常量的位置很重要。盡量避免在聲明文件內(nèi)定義嵌施,因?yàn)槌A棵麜?huì)相互沖突饲化。
? ? ? ?1.如果不想公開某個(gè)常量,就定義在實(shí)現(xiàn)文件內(nèi)吗伤。?
? ? ? ?2.對(duì)外公布某個(gè)常量吃靠。該常量需放在全局符號(hào)表中(globe symbol table)。
? ? ? ?3.命名需謹(jǐn)慎足淆,因?yàn)榉旁谌址?hào)表中巢块。為避免沖突礁阁,最好使用與之相關(guān)的類名做前綴。
? ? ? ?4.該種定義方法優(yōu)先使用#define夕冲。編譯器會(huì)確保常量值不變氮兵。預(yù)處理定義可能會(huì)被他人隨意更改。
? ? ? ?5.最好不使用預(yù)處理定義常量歹鱼。
聲明文件中 .h
extern NSString *const PageMap;
實(shí)現(xiàn)文件 .m
NSString *const PageMap = @"VALUE";
常量的定義是由右往左解讀泣栈,PageMap 是一個(gè)常量,該常量是指針弥姻,指向 NSString 對(duì)象南片。編譯器看到 extern 關(guān)鍵字,就會(huì)自動(dòng)處理該常量了庭敦。傳遞給編譯器的消息就是疼进,在全局符號(hào)表中會(huì)有一個(gè) PageMap的符號(hào),允許代碼使用該常量秧廉,當(dāng)鏈接成二進(jìn)制文件后一定會(huì)找到該常量伞广。該常量必須要定義嗎,而且只能定義一次疼电。編譯器會(huì)在數(shù)據(jù)段(data section)為它分配存儲(chǔ)空間嚼锄。連接器會(huì)把該目標(biāo)文件與其他目標(biāo)文件鏈接,最終生成二進(jìn)制文件蔽豺,凡是用到 PageMap 全局符號(hào)的地方区丑,鏈接器都能將其自動(dòng)解析。
總結(jié)
1修陡、不要使用預(yù)處理定義常量沧侥。定義出的常量不包含類型信息,編譯器只會(huì)在編譯前根據(jù)執(zhí)行查找與替換操作魄鸦。他人可重新定義常量值宴杀,這很危險(xiǎn)。
2号杏、在實(shí)現(xiàn)文件中(.m)使用 static const 修飾的變量婴氮,作用域就是.m 文件,不在全局符號(hào)表中盾致。
3、在聲明文件中(.h)使用 extern 聲明全局變量荣暮,在相關(guān) .m 文件中定義該變量值庭惜,該變量存于全局符號(hào)表中,命名時(shí)注意重名穗酥,最好添加類前綴加以區(qū)分护赊。