你能區(qū)分下面嗎?以及什么情況下使用?
#define HSCoder @"你了解我嗎“
NSString *coder = @"你了解我嗎";
extern NSString *coder;
extern const NSString *coder;
static const NSString *coder = @"你了解我嗎";
const NSString *coder;
NSString const *coder;
NSString *const coder;
當(dāng)我們想全局共用一些數(shù)據(jù)時(shí),可以用宏,常量,變量
宏:
#define HSCoder @"你了解我嗎“
常量:
static const NSString *coder = @"你了解我嗎";
const NSString *coder;
NSString const *coder;
NSString *const coder;
變量:
NSString *coder = @"你了解我嗎";
static和extern? 的區(qū)別在其他的筆記中有提到,點(diǎn)擊鏈接可閱讀。
宏、常量、變量的區(qū)別
宏:
只是在與處理器里進(jìn)行文本替換,沒有類型,不做任何類型檢查,編譯器可以對相同的字符串進(jìn)行優(yōu)化,只保存一份到.rodata段中。甚至有相同后綴的字符串也可以優(yōu)化,你可以用GCC 編譯測試,"Hello world" 與 "world" 兩個(gè)字符串,只存儲前面一個(gè)。取的時(shí)候只需要給前面和中間的地址,如果是整形、浮點(diǎn)型會(huì)有多份拷貝,但這些數(shù)寫在指令中。占的只是代碼段而已,不占用內(nèi)存空間,大量用宏會(huì)導(dǎo)致二進(jìn)制文件變大。
變量:
共享一塊內(nèi)存空間,就算項(xiàng)目中N處用到,也不會(huì)分配N塊內(nèi)存空間,可以被修改,在編譯階段會(huì)執(zhí)行類型檢查
常量:
共享一塊內(nèi)存空間,就算項(xiàng)目中N處用到,也不會(huì)分配N塊內(nèi)存空間,可以根據(jù)const修飾的位置設(shè)定能否修改,在編譯階段會(huì)執(zhí)行類型檢查
常量區(qū)分
全局常量:不管你定義在任何文件夾,外部都能訪問
const NSString *coder;
例如:



局部變量:用static修飾后,不能提供外界訪問
例如:


const修飾位置不用有什么區(qū)別
1.const NSString *coder;
"*coder"不能被修改,coder可以被修改
2.NSString const *coder;
"*coder"不能被修改,coder可以被修改
3.NSString *const coder;
“coder”不能被修改,“*coder”可以被修改
結(jié)論:const右邊的不能被修改。
例如:(ps:打印結(jié)果均為寫報(bào)錯(cuò)語句前打印)
1.const NSString *coder;

2.NSString const *coder;

3.int? *const coder;

總結(jié):如上一和三的值是可以被改變了,所以當(dāng)我們定義一個(gè)常量且不想被修改應(yīng)該使用第三種昂
3.NSString *const coder;
一般,定義全局常量會(huì)寫在獨(dú)立文件里
例如



