前言
我們經(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
心情
有點困,但還是能爬起來。