iOS預(yù)處理指令及其應(yīng)用 (宏)【例如#ifdef】

一、常規(guī)格式:如果(1)滿足,就執(zhí)行(2),否則執(zhí)行(3)
#ifdef (1)

(2)

#else

(3)

#endif

二、常用預(yù)處理命令介紹
#if                      編譯預(yù)處理中的條件命令, 相當(dāng)于C語(yǔ)法中的if語(yǔ)句
#ifdef                 判斷某個(gè)宏是否被定義, 若已定義, 執(zhí)行隨后的語(yǔ)句
#endif               #if, #ifdef, #ifndef這些條件命令的結(jié)束標(biāo)志.
#define              定義一個(gè)預(yù)處理宏


#undef               取消宏的定義
#include            包含文件命令
#include_next   與#include相似, 但它有著特殊的用途
#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è)宏是否被定義
#line                標(biāo)志該語(yǔ)句所在的行號(hào)
#                      將宏參數(shù)替代為以參數(shù)值為內(nèi)容的字符竄常量
##                   將兩個(gè)相鄰的標(biāo)記(token)連接為一個(gè)單獨(dú)的標(biāo)記
#pragma        說(shuō)明編譯器信息#warning       顯示編譯警告信息
#error            顯示編譯錯(cuò)誤信息
#define SAFE_RELEASE(obj) if(obj){[obj release];obj=nil;} 釋放

   1) __VA_ARGS__ 是一個(gè)可變參數(shù)的宏,很少人知道這個(gè)宏,這個(gè)可變參數(shù)的宏是新的C99規(guī)范中新增的,目前似乎只有g(shù)cc支持(VC6.0的編譯器不支持)。宏前面加上##的作用在于,當(dāng)可變參數(shù)的個(gè)數(shù)為0時(shí),這里的##起到把前面多余的","去掉的作用,否則會(huì)編譯出錯(cuò), 你可以試試。
  2) __FILE__ 宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的源文件名
  3) __LINE__宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的行號(hào)
  4) __FUNCTION__宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的函數(shù)名稱(chēng)

三.、利用預(yù)處理指令判斷當(dāng)前環(huán)境的Xcode版本

  • 用xcode 8.3.2運(yùn)行了如下代碼:


    image.png

四、利用預(yù)處理指令進(jìn)行測(cè)試服務(wù)器地址和生產(chǎn)服務(wù)器地址的切換。鏈接


#ifdef DEBUG

static NSString *const kFPBaseUrl =@"http://(1)測(cè)試服務(wù)器地";

#else

static NSString *const kFPBaseUrl =@"http://(2)生產(chǎn)服務(wù)器地址";

#endif

五、利用預(yù)處理進(jìn)行開(kāi)發(fā)環(huán)境與線上環(huán)境的判斷

  • 通過(guò)宏定義一個(gè)#define ISDEVBOOL,然后將這個(gè)宏作為預(yù)處理命令的參數(shù),通過(guò)判斷這個(gè)參數(shù)有沒(méi)有值,來(lái)實(shí)現(xiàn)開(kāi)發(fā)環(huán)境與線上環(huán)境的判斷。開(kāi)發(fā)中我們手動(dòng)注釋這個(gè)值,那么就執(zhí)行線上環(huán)境的BaseUrl;不注釋的話,就執(zhí)行開(kāi)發(fā)環(huán)境的BaseUrl.
  • 詳情請(qǐng)見(jiàn)如下截圖:
Snip20170614_38.png

以上圖片有個(gè)錯(cuò)誤,注意到了嗎?沒(méi)注意的話,項(xiàng)目中會(huì)提示如下錯(cuò)誤

  unterminated conditional directive
  • 解決辦法:不要忘記寫(xiě)#endif.正確的類(lèi)似代碼如下:
#define ISDEVBOOL
#ifdef ISDEVBOOL // 開(kāi)發(fā)環(huán)境
#define REQUEST_MAINLINK_ROOT @"https://ym2.0633hr.com/" // 測(cè)試服務(wù)器地址
#else
#define REQUEST_MAINLINK_ROOT @"https://yimiaozhaopin.com/" // 正式服務(wù)器地址
#endif

六、利用預(yù)處理執(zhí)行進(jìn)行NSLog或者自定義Log的全局顯示和隱藏

    1. Release狀態(tài)下


      image.png

      Snip20170527_11.png
    1. Debug狀態(tài)下
image.png

image.png

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

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,001評(píng)論 25 709
  • 1.運(yùn)動(dòng):走跑30分鐘 2.閱讀:《抗日戰(zhàn)爭(zhēng)》30頁(yè) 3.單詞:百詞斬30個(gè) 4.練字:硬筆字帖1頁(yè) 5.聽(tīng)書(shū):1...
    吳興老魚(yú)閱讀 153評(píng)論 0 0
  • 眾所周知,StatsD 負(fù)責(zé)收集并聚合測(cè)量值。之后,它會(huì)將數(shù)據(jù)傳給 Graphite,后者以時(shí)間序列為依據(jù)存儲(chǔ)數(shù)據(jù)...
    OneAPM閱讀 1,872評(píng)論 0 3
  • 牛扎糖、利是糖、瑞士糖伴隨我長(zhǎng)大。前者隨著時(shí)間變遷味道千變?nèi)f化,后兩者一直都是同一品牌味道無(wú)差。每次見(jiàn)到牛扎糖都會(huì)...
    虛心竹閱讀 873評(píng)論 0 3

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