IOS基礎(chǔ)知識-宏定義使用

寫一個簡單的宏定義:

 #define MIN(a,b) ((a) > (b) ? (a) : (b))

指令與作用:

#  空指令,無任何效果
#define  定義宏
#undef  取消已定義的宏
#if  如果給定條件為真应狱,則編譯下面代碼
#ifdef  如果宏已經(jīng)定義疾呻,則編譯下面代碼
#ifndef  如果宏沒有定義,則編譯下面代碼
#elif  如果前面的#if給定條件不為真尉咕,當(dāng)前條件為真璃岳,則編譯下面代碼
#endif  結(jié)束一個#if……#else條件編譯塊
#error  停止編譯并顯示錯誤信息

運(yùn)算符:

例如: #define demo1(n) "123"#n
出現(xiàn)在宏定義中的#運(yùn)算符把跟在其后的參數(shù)轉(zhuǎn)換成一個字符串。有時把這種用法的#稱為字符串化運(yùn)算符

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%s",demo1(abc));
}
//打印會輸出 123abc

例如:#define demo2(m,n,j) m##n##j

##運(yùn)算符用于把參數(shù)連接到一起晦款。預(yù)處理程序把出現(xiàn)在##兩側(cè)的參數(shù)合并成一個符號
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%d",demo2(1, 2, 3));
}
//打印會輸出 123

VA_ARGS 是一個可變參數(shù)的宏枚冗,很少人知道這個宏,這個可變參數(shù)的宏是新的C99規(guī)范中新增的坛怪,目前似乎只有g(shù)cc支持(VC6.0的編譯器不支持)股囊。
實現(xiàn)思想就是宏定義中參數(shù)列表的最后一個參數(shù)為省略號(也就是三個點(diǎn))。這樣預(yù)定義宏_ VA_ARGS _就可以被用在替換部分中居灯,替換省略號所代表的字符串。比如:

#define PR(...) printf(__VA_ARGS__)
int main()
{
    int wt=1,sp=2;
    PR("hello\n");
    PR("weight = %d, shipping = %d",wt,sp);
    return 0;
}
輸出結(jié)果: 
hello 
weight = 1, shipping = 2 
省略號只能代替最后面的宏參數(shù)义锥。 
#define W(x,…,y)錯誤岩灭! 

注意:##__VA_ARGS__ 宏前面加上##的作用在于,當(dāng)可變參數(shù)的個數(shù)為0時柱恤,這里的##起到把前面多余的","去掉的作用,否則會編譯出錯
20180727111856842.png

宏定義的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

提高了程序的可讀性膨更,同時也方便進(jìn)行修改缴允,用戶只需要在一處定義,多處使用矗漾,修改也只需要修改一處
提高程序的運(yùn)行效率:使用帶參的宏定義既可完成函數(shù)調(diào)用的功能薄料,又能避免函數(shù)的出棧與入棧操作,減少系統(tǒng)開銷誊役,提高運(yùn)行效率谷市,如果有一個函數(shù)會在工程中頻繁使用,可以考慮一下宏定義

缺點(diǎn)

由于是直接嵌入的迫悠,所以代碼可能相對多一點(diǎn)
嵌套定義過多可能會影響程序的可讀性,而且很容易出錯艺玲;
對帶參的宏而言鞠抑,由于是直接替換,并不會檢查參數(shù)是否合法秒梳,存在安全隱患。
預(yù)編譯語句僅僅是簡單的值代替端幼,缺乏類型的檢測機(jī)制
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末婆跑,一起剝皮案震驚了整個濱河市庭呜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扶关,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件节槐,死亡現(xiàn)場離奇詭異拐纱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)揍庄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蚂子,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缭黔,“玉大人,你說我怎么就攤上這事馏谨。” “怎么了钠糊?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵壹哺,是天一觀的道長。 經(jīng)常有香客問我管宵,道長攀甚,這世上最難降的妖魔是什么秋度? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任荚斯,我火速辦了婚禮,結(jié)果婚禮上事期,老公的妹妹穿的比我還像新娘纸颜。我一直安慰自己,他們只是感情好唠倦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布涮较。 她就那樣靜靜地躺著,像睡著了一般法希。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毛肋,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天润匙,我揣著相機(jī)與錄音唉匾,去河邊找鬼。 笑死巍膘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的璃饱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼荚恶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谒撼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤抵皱,失蹤者是張志新(化名)和其女友劉穎叨叙,沒想到半個月后堪澎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體味滞,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年昨凡,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚁署。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡哪痰,死狀恐怖久妆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肋演,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布爹殊,位于F島的核電站奸绷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏健盒。R本人自食惡果不足惜称簿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一惰帽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧授药,春花似錦呜魄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至伪很,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猫十,已是汗流浹背呆盖。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留江兢,地道東北人丁频。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓席里,卻偏偏與公主長得像叔磷,于是被迫代替她去往敵國和親改基。 傳聞我的和親對象是個殘疾皇子咖为,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評論 2 354

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