const和#define都可以用來定義常量
const:用來定義一個常量, 其實在 C++中诸典,const 修飾的常量能不能修改,還是需要看const指向常量還是指向常量的指針狐粱,在這里就不深入了,感興趣的朋友可以在網(wǎng)上看看 C++中 const 的用法互墓。const 命名遵循駝峰命名規(guī)則,如果僅在當前編譯單元里面篡撵,則以小寫 k開頭豆挽;若在類之外調用,則以類名為前綴帮哈。
const 常量用 static 修飾意味著改常量僅在定義此變量的.m 文件中可見;如果不加 static咖刃,編譯器會為它創(chuàng)建一個外部符號私蕾,此時僵缺,如果另一個文件中也聲明了同名常量踩叭,就會報錯。
如果 const 常量在其他的類中也需要用到自脯,那么就需要放在全局符號表(global symbol table)中 了。
// ? .h 文件
extern NSString *const ClassName_ConstantName;
// ?.m 文件
NSString *const?ClassName_ConstantName = @"name";
編譯器看到頭文件中的extern關鍵字膏潮,就能明白如何在引入此頭文件的代碼中處理該常量了满力,這個關鍵字是要告訴編譯器轻纪,在全局符號表中將會有一個名叫ClassName_ConstantName的符號叠纷;編譯器無需查看其定義。
define, 定義常量, 是一條預編譯指令, 編譯器在編譯階段會將所有使用到宏的地方簡單地進行替換.?
區(qū)別:
define不指定類型涩嚣,const指定類型
const定義常量從匯編的角度來看,只是給出了對應的內存地址顷歌,而不是像#define一樣給出的是立即數(shù),所以眯漩,const定義的常量在程序運行過程中只有一份拷貝溪窒,而#define定義的常量在內存中有若干個拷貝,
宏能做到const不能辦到的事.
1澈蚌、宏能定義函數(shù)
2灼狰、OC的單例模式用到宏
3、宏還能根據(jù)傳入的參數(shù)生成字符串
4交胚、宏定義的常量可以被重寫