Objective-C 預(yù)處理指令 #

預(yù)處理指令是以 # 號開頭的代碼行。#號必須是該行除了任何空白字符外的第一個字符。# 后是指令關(guān)鍵字咪惠,在關(guān)鍵字和#號之間允許存在任意個數(shù)的空白字符滞时。整行語句構(gòu)成了一條預(yù)處理指令,該指令將在編譯器進(jìn)行編譯之前對源代碼做某些轉(zhuǎn)換柜候。

#                 // 空指令,無任何效果
#import “"        // 導(dǎo)入一個源代碼文件      
#include “”       // 包含一個源代碼文件
#define macro     // 定義宏
#undef macro      // 取消定義宏
#if condition     // 條件編譯指令,如果滿足condition,則編譯以下內(nèi)容
#ifdef            // 條件編譯指令不脯,如果定義了,則往下編譯
#ifndef           // 條件編譯指令海洼,如果沒有定義跨新,則往下編譯
#elif             // 如果前面的 #if 不為真,當(dāng)前條件為真坏逢,則往下編譯
#endif            // 結(jié)束條件編譯塊
#error            // 停止編譯域帐,并顯示錯誤信息,一般用于條件編譯
  • 導(dǎo)入/包含文件

    #import#include 大部分功能是一樣的是整,但是他處理了重復(fù)引用的問題肖揣,我們在引用文件的時候不用再去自己進(jìn)行重復(fù)引用處理。

    例如:有 A.h B.h C.h三個頭文件
    A.h需要引入B.h 和 C.h, 而B.h也引入C.h 這樣就構(gòu)成了重復(fù)引用浮入,使用#import就可以避免這種情況龙优。

    有兩種引入方式,一種使用尖括號< >,告訴編譯器在編譯器自帶的或外部庫的頭文件中搜索被包含的頭文件事秀,另一種使用雙引號"" 彤断,表示在當(dāng)前被編譯的應(yīng)用程序的源代碼文件中搜索被包含的頭文件,如果找不 到易迹,再搜索編譯器自帶的頭文件宰衙。

    在OC中應(yīng)盡量少在類的頭文件中引入其他頭文件,如果需要在頭文件中用到引入的頭文件睹欲,首先考慮向前聲明(forward declaring),將引入頭文件的時機(jī)盡量延后供炼,只有在有需要時才引入。

    @class YourClass
    

    在這種不需要知道 YourClass 類的全部細(xì)節(jié)窘疮,只需要知道有一個類名叫 YourClass 就好的情況下袋哼,使用向前聲明可以減少編譯時間,提高效率闸衫。

    然而有些協(xié)議涛贯,比如“委托協(xié)議”就需要知道協(xié)議內(nèi)容,這時候不能使用向前聲明蔚出,應(yīng)該考慮在類的擴(kuò)展 class-continuation category 中實(shí)現(xiàn)弟翘,這樣的話需要在實(shí)現(xiàn)文件中引入包含的委托協(xié)議頭文件即可含懊,而不需要將其放在公共頭文件中。

    要點(diǎn):

    1. 除非有必要衅胀,否則不要引入頭文件岔乔,一般來說,應(yīng)在某個類的頭文件中使用向前聲明來提及別的類滚躯,并在實(shí)現(xiàn)文件中引入那些類的頭文件雏门。這樣做可以盡量降低類之間的耦合。
    2. 有時無法使用向前聲明掸掏,比如要聲明某個類遵循意一項(xiàng)協(xié)議茁影,這種情況下,盡量把該類遵循的某協(xié)議的這條聲明移至 class-continuation category中丧凤。如果不行的話募闲,就把協(xié)議單獨(dú)放在一個頭文件中,然后將其引入愿待。
  • 宏定義

    #define 定義一個宏浩螺,用 #undef 取消定義一個宏,宏的定義在編譯時只是簡單的替換

    #define TEST_MACRO 100       // 定義宏  
    int array[TEST_MACRO];       // 使用定義的宏
    #undef TRST_MACRO            // 取消定義宏
    #define VALUE1 10
    #define VALUE2 20
    #define VALUE (VALUE1 + VALUE2)
    

    注意:
    定義宏常用大寫字母作為宏名
    在定義宏的時候仍侥,后面如果有計(jì)算要出,習(xí)慣于使用括號
    宏定義可以定義一個函數(shù) 例如:

    #define SQUARE(x) (x * x)
    int square = SQUARE(5);
    
  • # 運(yùn)算符
    # 運(yùn)算符將參數(shù)轉(zhuǎn)換為一個字符串 例如:

    #define TEST(n) @"SHIT"#n
    NSLog(@"%@",TEST(ON));  // 此時將ON作為字符串拼接到“SHIT”后面
    

    控制臺輸出為

    2017-08-19 15:02:30.165640+0800 VowelMovement[7289:370495] SHITON
    Program ended with exit code: 0
    
  • ## 運(yùn)算符
    ## 運(yùn)算符的作用是將出現(xiàn)在其兩側(cè)的參數(shù)合并 例如:

    #define TEST(x, y, z) x##y##z
    NSLog(@"%d", TEST(1, 2, 3));
    

    控制臺輸出結(jié)果

    2017-08-19 15:08:32.405656+0800 VowelMovement[7336:375139] 123
    Program ended with exit code: 0
    
  • 條件編譯指令

    1. #if指令:檢測跟在制造另關(guān)鍵字后的常量表達(dá)式。如果表達(dá)式為真农渊,則編譯后面的代碼患蹂,知道出現(xiàn)#else#elif#endif為止砸紊;否則就不編譯传于。

    2. #endif用于終止#if預(yù)處理指令

    3. #ifdef#ifndef : #ifdefined 等價于 #ifdef ; #ifdefined等價于#ifndef

    4. #else指令用于某個#if指令之后,當(dāng)前面的#if指令的條件不為真時醉顽,就編譯#else后面的代碼沼溜。#endif指令將中指上面的條件塊。

    5. #elif預(yù)處理指令綜合了 #else#if指令的作用徽鼎。

      #ifdef TEST
              printf("defined TEST");
      #else
              printf("no define");
      #endif
      

Reference:
《Effective Objective-C 2.0 編寫高質(zhì)量iOS與OS X代碼的52個有效方法》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盛末,一起剝皮案震驚了整個濱河市弹惦,隨后出現(xiàn)的幾起案子否淤,更是在濱河造成了極大的恐慌,老刑警劉巖棠隐,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件石抡,死亡現(xiàn)場離奇詭異,居然都是意外死亡助泽,警方通過查閱死者的電腦和手機(jī)啰扛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門嚎京,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人隐解,你說我怎么就攤上這事鞍帝。” “怎么了煞茫?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵帕涌,是天一觀的道長。 經(jīng)常有香客問我续徽,道長蚓曼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任钦扭,我火速辦了婚禮纫版,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘客情。我一直安慰自己其弊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布膀斋。 她就那樣靜靜地躺著瑞凑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪概页。 梳的紋絲不亂的頭發(fā)上籽御,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音惰匙,去河邊找鬼技掏。 笑死,一個胖子當(dāng)著我的面吹牛项鬼,可吹牛的內(nèi)容都是我干的哑梳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼绘盟,長吁一口氣:“原來是場噩夢啊……” “哼鸠真!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起龄毡,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤吠卷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沦零,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祭隔,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年路操,在試婚紗的時候發(fā)現(xiàn)自己被綠了疾渴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片千贯。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搞坝,靈堂內(nèi)的尸體忽然破棺而出搔谴,到底是詐尸還是另有隱情,我是刑警寧澤桩撮,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布己沛,位于F島的核電站,受9級特大地震影響距境,放射性物質(zhì)發(fā)生泄漏申尼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一垫桂、第九天 我趴在偏房一處隱蔽的房頂上張望师幕。 院中可真熱鬧,春花似錦诬滩、人聲如沸霹粥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽后控。三九已至,卻和暖如春空镜,著一層夾襖步出監(jiān)牢的瞬間浩淘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工吴攒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留张抄,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓洼怔,卻偏偏與公主長得像署惯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子镣隶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容