一、常規(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的全局顯示和隱藏
-
Release狀態(tài)下
image.png
Snip20170527_11.png
-
- Debug狀態(tài)下

image.png

image.png


