#ifdef #ifndef #define #endif

前言

我們經(jīng)常會偶遇上述的宏,那你思考過這些宏的5個W嗎?

WHAT

上述幾個宏是為了進(jìn)行條件編譯所定義的。一般情況下,源程序中所有的行都參加編譯。但有時希望只對滿足一定條件的某部分代碼進(jìn)行編譯,也就是對一部分內(nèi)容指定編譯的條件,這就是“條件編譯”。 有時,希望當(dāng)滿足條件時對一組語句進(jìn)行編譯,而當(dāng)條件不滿足時則編譯另一組語句。

ifdef 是 if define 的縮寫

ifndef 是 if not define 的縮寫

WHO

#ifdef 標(biāo)識符

程序段1  
 
#else 

程序段2

#endif
   

解釋: 如果標(biāo)識符被定義過,那么編譯程序段1;否則編譯程序段2

#ifndef 標(biāo)識符

程序段1  
 
#else 

程序段2

#endif
   

解釋: 如果標(biāo)識符沒有被定義過,那么編譯程序段1;否則編譯程序段2

#if 表達(dá)式

程序段1  
 
#else 

程序段2

#endif
   

解釋:當(dāng)表達(dá)式為真時,那么編譯程序段1;否則編譯程序段2

WHERE

上面講的不就是if else 條件語句。針對上面的形式看2個例子


#define DEBUG

int number = 10;

#ifdef DEBUG

    NSLog(@"當(dāng)前的number------>%ld",number);

#endif
   

解釋:如果在編譯 #ifdef 之前 定義了DEBUG ,那么就打印出當(dāng)前的數(shù)字。 當(dāng)我發(fā)布的時候,我不想打印數(shù)字。那我只需要將 #define DEBUG 注釋掉即可。


#define OPENTYPE 1

int number = 10;

#if OPENTYPE 

  NSLog(@"當(dāng)前的number------>%ld",number);

#endif
   

解釋:如果在編譯 #if 的時候判斷OPENTYPE的值,如果為真,那么就打印出當(dāng)前的數(shù)字。如果為假,那么就不打印數(shù)字。

WHY

為什么要使用這個呢?如上例,我不想打印的時候,直接注釋掉 NSLog 就可以了。那咱們就聊一下使用宏的好處。

  • 為什么不直接用if else

    在What中,我們說了它是條件編譯。如果程序代碼量很 大,通過使用宏,我們可以只編譯需要的代碼,不必全部編譯。而if else 是全部編譯。

  • 為什么不通過注釋的方法。

    通過將不需要的程序段注釋掉,可以減少編譯。但我們頻繁的在DEBUG 和 RELEASE 之間切換的時候,而代碼中又有很多與之相關(guān)的東西。那要多麻煩啊。而宏的方法,我們只需要決定是否注釋 #define DEBUG .它在這里起了總閘的作用。

  • 提高程序的通用性

    針對不同的環(huán)境,我們只需要在程序的最初定義標(biāo)識符即可,不需要改動源代碼。

WHEN

林子大了什么鳥都有,程序大了什么#define都有,如果和之前的重復(fù)了怎么辦?有什么好的措施?

#define number 10

// 忘了我是否定義過 number 

#if defined number  //如果定義了

#undef number

#define number 5

#else  //如果沒定義

#define number 5

#endif

解釋:首先判斷是否定義了number,如果定義就通過 #undef 解綁,然后在定義。

當(dāng)然我們也可以利用上述的 #ifndef 實現(xiàn)同樣效果

#ifndef number  //如果沒定義

#define number 5

#else 

#undef number

#define number 5

#endif

心情

有點困,但還是能爬起來。

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

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,535評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,917評論 25 709
  • http://www.open-open.com/lib/view/open1390651437117.html ...
    Xtuphe閱讀 1,357評論 0 10
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,041評論 0 9
  • 目錄 一.預(yù)處理的工作方式... 3 1.1.預(yù)處理的功能... 3 1.2預(yù)處理的工作方式... 3 二.預(yù)處理...
    朱森閱讀 1,539評論 0 2

友情鏈接更多精彩內(nèi)容