iOS -- 多用類型常量, 少用 #define 預處理指令 (3)

?多用類型常量, 少用 #define 預處理指令

#define 預處理指令會把碰到的所有 指定名稱 一律換位 定義的內容, 這樣的話, 假設此指令在某個頭文件中, 那么所有引入這個頭文件的代碼, 都會被替換

解決這個問題, 有一個辦法

static const NSString * name = @"name";

請注意,用此方式定義的常量包含類型信息, 器好處是清除地描述了常量的含義,?

還要注意常量名稱, 常量命名的方法是: 若常量局限于 "編譯單元", 也就是實現(xiàn)文件, 即 .m 文件里面, 則在前面加字幕 k. 若常量在類之外可見, 則通常以類名為前綴


定義常量的位置很重要, 我們總習慣在頭文件里聲明 預處理指令, 這樣所有引入這份頭文件的其他文件都會出現(xiàn)這個 預處理指令, 就是用static const 定義的常量也不應該出現(xiàn)在頭文件中,

正確的做法是, 若不打算公開某個常量, 則應該將其定義在使用該常量的實現(xiàn)文件里面, ?在 @implemantation xxxxxxxx 上方寫.

而用 static 修飾符則意味著該白能量僅在定義變量的編譯單元中可見, 加入聲明次變量時不加 static ,此時若是另一個編譯單元中也聲明了 同名變量, 編輯器就會報錯

有時候需要對外公開某個常量, 應該這樣來定義

在 頭文件中,即 .h 文件

extern NSString*const XXXXXX;

在 實現(xiàn)文件中, 即 ?.m 文件

NSString *const XXXXXX = @"xxxxxx";

這個常量在頭文件中 聲明, 且在實現(xiàn)文件中定義,?

//這樣定義常量要由于使用 #define 預處理指令, 因為編譯器會確保常量值不變,?


總結 :?

不要用預處理指令定義吃那個兩, 這樣定義出來的常量不包含類型信息, 編譯器只是在編譯前據(jù)此執(zhí)行查找與替換操作, 即使有人沖洗定義了常量值, 編譯器也不會產生警告信息,這將導致應用程序的常量值不一致.

在實現(xiàn)文件中使用 static const 來定義 只在編譯單元可見的常量 , 由于此類常量不在全局單元符號表中, 所以無需為其名稱加前綴

在頭文件中使用 extern 來聲明全局變量, 并在相關實現(xiàn)文件中定義其值, 這種常量要出現(xiàn)在全局符號表中, 所以其名稱應加區(qū)隔, 通常用用戶只相關的類名做前綴

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容