你能區(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ù)時,可以用宏,常量,變量
宏:
#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" 兩個字符串,只存儲前面一個当编。取的時候只需要給前面和中間的地址届慈,如果是整形、浮點(diǎn)型會有多份拷貝忿偷,但這些數(shù)寫在指令中金顿。占的只是代碼段而已,不占用內(nèi)存空間鲤桥,大量用宏會導(dǎo)致二進(jìn)制文件變大揍拆。
變量:
共享一塊內(nèi)存空間,就算項目中N處用到茶凳,也不會分配N塊內(nèi)存空間嫂拴,可以被修改,在編譯階段會執(zhí)行類型檢查
常量:
共享一塊內(nèi)存空間贮喧,就算項目中N處用到筒狠,也不會分配N塊內(nèi)存空間,可以根據(jù)const修飾的位置設(shè)定能否修改箱沦,在編譯階段會執(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é)果均為寫報錯語句前打印)
1.const NSString *coder;
2.NSString const *coder;
3.int? *const coder;
總結(jié):如上一和三的值是可以被改變了康愤,所以當(dāng)我們定義一個常量且不想被修改應(yīng)該使用第三種昂
3.NSString *const coder;
一般儡循,定義全局常量會寫在獨(dú)立文件里
例如