define和預處理指令的使用

2021-07-02 02:14:21 字數 1569 閱讀 7935

今天再總結一點#define和預處理指令的使用。

預處理過程掃瞄源**,對其進行初步的轉換,產生新的源**提供給編譯器。可見預處理過程先於編譯器對源**進行處理。

預處理指令是以#開頭的**行,#後是指令關鍵字,在關鍵字和#號之間允許存在任意個數的空白字元。正行語句構成了一條預處理指令,該指令醬紫啊編譯器進行編譯之前對源**做某些轉換,下面是一些常用的預處理指令,

#    空指令,沒有任何效果

#include 包含乙個源**檔案

#define 定義巨集

#undef 取消定義巨集

#if 如果條件為真,則編譯下面的**

#elif 如果前面的#if不為真,則編譯下面的**

#endif 結束乙個#if...#elif條件編譯塊

#ifdef 如果已經定義了某個巨集,則編譯下面的**

#ifndef 如果沒有定義某個巨集,則編譯下面的**

#error 停止編譯並顯示錯誤資訊

最近在看公司自己封裝的sdk的時候,遇到了很多#ifdef和#ifndef,下面我就主要距離來說一說這個預處理指令的靈活使用。比如你現在通過**建立了乙個button,

uibutton *btn = [uibutton buttonwithtype:uibuttontyperoundedrect];

btn.frame = cgrectmake(0, 0, 100, 40);

[btn settitle:@"button" forstate:uicontrolstatenormal];

[btn addtarget:self action:@selector(btnclicked) forcontrolevents:uicontroleventtouchupinside];

[self.view addsubview:btn];

但是根據新的需求,這個button暫時不需要顯示在介面上面,這時候不可以將該button相關的**注釋掉,這也不失為乙個好方法。但是我更推薦使用預處理指令來進行條件判斷,下面我使用兩種方法來說明,

(1)第一種方法,定義乙個具體的巨集

#define debug_showbutton 0

這時候如果想顯示該button物件,那麼將#define debug_showbutton 1,否則寫為#define debug_showbutton 0。

(2)第二種方法,定義乙個沒有數值的巨集

這段**的意思就是如果定義了巨集debug_showbutton,那麼就將btn新增到父檢視,如果沒有定義的話,那麼不新增到父檢視。這時候如果我們想要將其新增到父檢視,則在檔案的頂部寫上#define debug_showbutton,對,這時候我們可以不給這個巨集指定對應的值,這個**僅僅表示定義乙個沒有對應值的巨集。

總結:這兩種方法,我更加推薦第二種,因為一般情況下,我們定義乙個有對應數值的巨集,是為了在**中使用該數值,例如#define kstatusbarhieght 20,這樣我們就可以把kstatusbarheight作為數值在**中使用,而第一種方法定義了有對應值的巨集debug_showbutton,我們卻沒有在**中使用它,這樣是不是有點浪費呢;而使用第二種方法定義乙個沒有對應值的巨集,它只是乙個識別符號,看起來簡單點。我個人更加推薦第二種!

define和預處理指令

define和預處理指令 妖妖隨筆 預處理過程是先於編譯器對源 進行處理 進行初步的轉換 產生新的源 提供給編譯器。格式 預處理指令是以 開頭的 行,後是指令關鍵字,在關鍵字和 號之間允許存在任意個數的空白字元。空指令 沒有任何效果 include 引入乙個源 檔案 define 定義巨集 unde...

預處理指令define

1 用預處理指令 define 宣告乙個常數,用以表明1年中有多少秒 忽略閏年問題 define seconds per year 60 60 24 365 ul 我在這想看到幾件事情 define 語法的基本知識 例如 不能以分號結束,括號的使用,等等 懂得預處理器將為你計算常數表示式的值,因此,...

預處理指令 define

電腦科學裡的巨集 macro 是一種批量處理的稱謂。一般說來,巨集是一種規則或模式,或稱語法替換,用於說明某一特定輸入 通常是字串 如何根據預定義的規則轉換成對應的輸出 通常也是字串 這種替換在預編譯時進行,稱作巨集展開。include define max 100 上述兩個稱為預處理指令,因為它們...