1. 程式人生 > >4.多用型別常量,少用#define預處理命令

4.多用型別常量,少用#define預處理命令

#define ANIMATION_DURATION 0.3

缺點:

1)這樣定義沒有型別資訊,使閱讀程式碼的人難以理解其意圖。

2)假設此指令宣告在了某個標頭檔案中,那麼所有引入這個標頭檔案的程式碼,其ANIMATION_DURATION都會背替換為0.3。

更好的定義方式:

static const NSTimeInterval kAnimationDuration = 0.3;

優點:

1)包含型別資訊NSTimeInterval,更清楚的描述了常量的含義。

2)避免了常量命名發生衝突。

注意:

1)常量的定義不應該出現在標頭檔案中,放在標頭檔案等於聲明瞭一個名叫kAnimationDuration的全域性變數,如果要放在標頭檔案中也應該以類名為字首命名。

2)使用const來宣告,如果試圖修改由const宣告的變數那麼編譯器就會報錯。我們更希望我們所定義的動畫播放時長不應該被修改。

3)使用static來宣告,static修飾的變數具有檔案作用域,防止其他檔案聲明瞭同名的變數導致編譯器丟擲錯誤資訊。

對外公開某個常量的定義方式

//in the header file

extern NSString * const StringConstant;

//in the implementation file

NSString * const StringConstant = @"VALUE";

使用const修飾指標常量是因為我們不希望有人改變此指標常量指向另一個NSString物件,使用extern宣告是告訴編譯器,在全域性符號表中有一個名字叫StringConstant的符號,也就是說編譯器無需檢視其定義,即允許程式碼使用此常量,但需要注意命名以防止衝突,通常以類名為字首。

對比預處理指令優點:編譯器會確保常量的值不變,一旦在實現檔案中定義好,即可隨處使用。而採取預處理指令所定義的常量可能會無意中遭人修改,從而導致應用程式各個部分所使用的值不同。

總結:

1)不要用預處理指令定義常量,這樣定義出來的常量不含型別資訊,編譯器只是會在編譯前據此執行查詢與替換操作。即使有人重新定義了常量的值,編譯器也不會產生警告資訊,這將導致應用程式中的常量值不一致。

2)在實現檔案中使用static const來定義“只在編譯單元內可見的常量”。由於此類常量不在全域性符號表中,所以無需為其名稱加字首。

3)在標頭檔案中使用extern來宣告全域性常量,並在相關實現檔案中定義其值。這種常量要出現在全域性符號表中,所以其名稱應加以區隔,通常用與之相關的類名做字首。