預(yù)處理宏使用指南
預(yù)處理就是對(duì)源文件進(jìn)行編譯前俭识,先對(duì)預(yù)處理部分進(jìn)行處理修壕,然后對(duì)處理后的代碼進(jìn)行編譯衅码。
常用宏說(shuō)明
#define 定義一個(gè)預(yù)處理宏
#undef 取消宏的定義
#if 編譯預(yù)處理中的條件命令定续, 相當(dāng)于C語(yǔ)法中的if語(yǔ)句
#ifdef 判斷某個(gè)宏是否被定義(#define過)粥脚, 若已定義窃肠, 執(zhí)行隨后的語(yǔ)句
#ifndef 與#ifdef相反, 判斷某個(gè)宏是否未被定義
#elif 若#if刷允, #ifdef冤留, #ifndef或前面的#elif條件不滿足碧囊, 則執(zhí)行#elif之后的語(yǔ)句, 相當(dāng)于C語(yǔ)法中的else-if
#else 與#if纤怒, #ifdef糯而, #ifndef對(duì)應(yīng), 若這些條件不滿足泊窘, 則執(zhí)行#else之后的語(yǔ)句熄驼, 相當(dāng)于C語(yǔ)法中的else
#endif #if, #ifdef烘豹, #ifndef這些條件命令的結(jié)束標(biāo)志.
defined 與#if瓜贾, #elif配合使用, 判斷某個(gè)宏是否被定義
#pragma 說(shuō)明編譯器信息
#warning 顯示編譯警告信息
#error 顯示編譯錯(cuò)誤信息
宏的使用步驟
1.如在 "Target > Build Settings > Preprocessor Macros > Debug" 設(shè)置"DEBUG=1”携悯。
2.之后在pch或工具類中就可以這么寫了:
#ifdef DEBUG
(debug 模式下的配置)
#else
(release 模式下的配置)
#endif
#ifdef使用說(shuō)明
#ifdef _XXXX //(ifdef=>if define)
代碼塊1
#elif defined _YYYY //(相當(dāng)于else if)
代碼塊2
#else
代碼塊3
#endif
如果_XXXX已被#define或Preprocessor Macros中定義過,則對(duì)代碼塊1進(jìn)行編譯祭芦,如果沒有定義_XXXX但定義了_YYYY,則編譯代碼塊2,否則只對(duì)代碼塊3進(jìn)行編譯憔鬼。
注意:#ifdef后面接的是一個(gè)宏
#ifndef使用說(shuō)明
#ifndef _XXXX //(ifndef=>if not define)
代碼塊1
#else
代碼塊2
#endif
#ifndef和#ifdef是相反的情況龟劲,如果沒有定義宏_XXXX,那么就會(huì)編譯代碼塊1,否則會(huì)編譯代碼塊2
#if使用說(shuō)明
#if 常量或表達(dá)式
代碼塊1
#else
代碼塊2
#endif
如果常量為真(非0)轴或,就編譯代碼塊1咸灿,否則編譯代碼塊2
注意:#if后必須是常量,不能是宏侮叮,因?yàn)楹晔沁\(yùn)行階段才有,#if是預(yù)編譯階段悼瘾,會(huì)找不到宏
最后強(qiáng)調(diào)一點(diǎn):這幾個(gè)宏定義只是決定代碼塊是否被編譯囊榜,而不是被執(zhí)行。
常用示例
1.判斷真機(jī)或模擬器
#if TARGET_OS_IOS
NSLog(@"真機(jī)測(cè)試");
#endif
#if TARGET_IPHONE_SIMULATOR
NSLog(@"模擬器");
#endif
2.獲取當(dāng)前設(shè)備的iOS版本
#define kIOSVersion [[UIDevice currentDevice].systemVersion doubleValue]