define 巨集 替代巨集

2021-09-11 11:52:46 字數 2140 閱讀 8468

編寫**時經常要定義常量

static const nstimeinterval kanimationduration = 0.3;

複製**

使用型別變數,可以清楚地描述常量的含義,以及它的型別。

命名法:若常量侷限於某「編譯單元」(translation unit,也就是實現檔案,.m檔案)之內,則在前面加字母k;若常量在類之外可見,則通常以類名為字首。

變數一定要同時用staticconst來宣告。如果試圖對const後面的變數修改,則編譯器會報錯。static && const區別

如果不加static,若另乙個編譯單元檔案中也宣告了同名變數,編譯器會報錯

如果要對外公開某個常量,則需要使用extern關鍵字在標頭檔案中宣告,然後在實現檔案中定義。

從右向左來理解,

extern nsstring * const constvalue;

constvalue 是乙個指標,

const 只修飾右邊的值,表明是唯讀,不能被修改

nsstring 指明常量型別,指向nsstring 物件

extern 指明可以被外部訪問。編譯器會明白無需檢視其定義,就可以使用此常量。

複製**

此類常量必須要定義,而且只能定義一次。通常將其定義在與宣告該常量的標頭檔案相對應的實現檔案裡。由實現檔案生成目標檔案時,編譯器會在資料段(data section)為字串分配儲存空間。鏈結器會把此目標檔案與其他目標檔案相鏈結,以生成最終的二進位制檔案。凡是用到這個全域性符號的地方,鏈結器都能將其解析。

##static && const && define ###static:

是用來宣告靜態變數,也叫做內部全域性變數,一般只會在實現檔案(.m檔案)**現。

靜態變數只會初始化一次

在方法內,修飾區域性變數,會延長變數的生命週期,程式結束才會銷毀,

在方法外,修飾全域性變數,會修改變數的作用域,在整個檔案,所有方法內都可以訪問該變數。

靜態變數屬於靜態儲存方式,跟全域性變數一樣儲存在靜態儲存區。

- (void)increasing 

[self increasing]; //====1===1

[self increasing]; //====2===1

複製**

修飾右邊的變數

被const修飾的變數是唯讀的

一般都使用nsstring * const constvalue;

//constvalue 不可變,*constvalue 可變

nsstring * const constvalue;

//constvalue 可變,*constvalue 不可變

const nsstring * constvalue;

//都不可變

const nsstring * const constvalue;

複製**

只是在預處理器裡進行文字替換,沒有型別,不做任何型別檢查,大量巨集會導致二進位制檔案變大。

巨集可以定義一些函式和方法。

# define dlog(fmt, ...)  nslog((@"[檔名:%s]\n" "[函式名:%s]\n" "[行號:%d] \n" fmt), __file__, __function__, __line__, ##__va_args__);

複製**

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

2. 在實現檔案中使用static const 來定義「只在編譯單元內可見的常量」。

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

define 巨集 替代巨集

編寫 時經常要定義常量 static const nstimeinterval kanimationduration 0.3 複製 使用型別變數,可以清楚地描述常量的含義,以及它的型別。命名法 若常量侷限於某 編譯單元 translation unit,也就是實現檔案,m檔案 之內,則在前面加字母k...

Swift中巨集 define的替代方案

我們在swift中已經沒有 define這種巨集定義了,那麼替代方案有哪些呢?1 let宣告常量 let is ios7 uidevice.currentdevice systemversion as nsstring doublevalue 7.0當然這種代替方案 只適用於一般的常量巨集定義,如果...

define巨集定義

預處理指令 以 開頭的行,都預處理指令,用於指示編譯器做一些預處理工作。比如 include h 注 預處理指令不是語句,行尾不要加分號 define的兩種用法 1.定義乙個 數值 2.定義乙個 算式 注 工程中應該避免使用這兩種方式 定義乙個值 define pi 3.14 int main 定義...