(1)const和#define都可以定義常量,但是const用途更廣。
(2)const 常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以對前者進行類型安全檢查。而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換可能會產(chǎn)生意料不到的錯誤。
(3) 有些集成化的調(diào)試工具可以對const 常量進行調(diào)試,但是不能對宏常量進行調(diào)試
- 什么是const ?
const是C/C++中的一個關鍵字(修飾符), const一般用來定義一個常量, 既然叫做常量, 即以后再也不能修改其值.
const定義常量
- 什么是#define?
而define, 宏定義, 則是一條預編譯指令, 編譯器在編譯階段會將所有使用到宏的地方簡單地進行替換. 如下圖所示 :
宏定義的替換
- 他們有什么用?
const 和 define 都能定義一個常量, 都能實現(xiàn)修改值修改一次, 則所有用上該常量的地方都同步改值, 一句代碼都不用改.
使代碼更易維護
提高代碼的效率
- 他們有什么區(qū)別?
相同點
都能定義常量
不同點
const定義常量從匯編的角度來看,只是給出了對應的內(nèi)存地址,而不是象#define一樣給出的是立即數(shù),所以,const定義的常量在程序運行過程中只有一份拷貝,而#define定義的常量在內(nèi)存中有若干個拷貝
const和define區(qū)別
編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內(nèi)存的操作,使得它的效率比宏定義要高
既然宏定義能做的事const都能做, 那宏還有什么存在的必要么?
存在即合理, 既然宏定義還沒被淘汰, 那必然有它存在的道理.
宏能做到const不能辦到的事.
宏能定義函數(shù)
OC的單例模式用到宏
宏還能根據(jù)傳入的參數(shù)生成字符串, 如下
宏定義高級功能
kStringCat(x, y) // 根據(jù)傳入的x和y拼接成字符串
kToString(x) // 根據(jù)傳入的x生成一個字符串
- 應該怎么用?
const有條原則, 那就是他右邊是什么, 什么就不可變, 如下
const不可變原則
用const修飾函數(shù)的形參, 則能提高代碼的安全性, 同時減少程序員之間的溝通成本
函數(shù)內(nèi)部只能用x和y, 不能改
宏多用于條件編譯, 如需要對于不同的情況執(zhí)行不同的代碼塊, 則可以使用宏的條件編譯來進行判斷
總結
在Objective-C中, 隨處可見const常量, 所以大家應該大膽地使用const, 它會帶給你大大的益處. 同時, 只要某個數(shù)據(jù)是定義之后永遠都不需要也不能修改的, 請使用const!
原文鏈接:https://blog.csdn.net/u011217834/article/details/89485670