C/C++ 宏定義

片頭圖片

宏定義在C語言占有舉足輕重的地位。底層框架自不用說,為了編譯優(yōu)化和方便灸眼,以及跨平臺能力霉囚,宏被大量使用盈罐,可以說底層開發(fā)離開define將寸步難行。使用宏的好處是不言自明票顾,在節(jié)省工作量的同時,代碼可讀性大大增加番刊。


通過本文你將了解到:

  • 宏定義入門
  • 對象宏
  • 函數(shù)宏
  • 宏定義變長參數(shù)

入門

宏定義簡單點說就是查找替換民晒,但是如果如此理解,那么只說對了一半磁滚,C中的宏分為兩類,對象宏函數(shù)宏晒他。

對象宏

對象宏一般用來定義一些常數(shù)津滞,比如:

#define PI 3.14159

define 關鍵字表明即將開始一個宏定義,僅接著PI是宏的名字,空格之后的數(shù)字是內(nèi)容颖侄。類似這樣#define X A的宏是比較簡單的孝鹊,會在編譯期間温自,將X替換為A,這個過程稱之為展開。

函數(shù)宏

函數(shù)宏是用得最多的丙者,函數(shù)宏可以節(jié)省大量的工作量。

#define MIN(A, B)   A < B ? A : B

int a = MIN(1, 2)营密;
printf("%d", a); => 1

輸出正確械媒,可以打包么?
在實際使用中會出問題么评汰,肯定會出問題纷捞。

int a = 2 * MIN(3, 4);
//=> int a = 2 * 3 < 4 ? 3 : 4;
//=> int a = 6 < 4 ? 3 : 4;
//=> int a = 4;

現(xiàn)在知道原因了,我因為展開后運算符優(yōu)先級的問題被去,乘法先被運算了主儡,修正簡單加個括號就行了

#define MIN(A, B) (A < B ? A : B)

僅僅如此么,如果我們執(zhí)行 MIN(3, 4 < 5 ? 4 : 5) 發(fā)現(xiàn)結(jié)果為4惨缆,展開宏后發(fā)現(xiàn)糜值,展開式時鏈接符號和被展開式中的運算符號優(yōu)先級相同丰捷,導致計算順序發(fā)生變化。所以還得再嚴格點臀玄。

#define MIN(A, B) ((A) < (B) ? (A) : (B))

由上可以知道瓢阴,函數(shù)宏可以簡單的將公式展開,這樣能節(jié)省工作量么健无,如果僅僅如此荣恐,當然不行,不過如果運用好#與##符號就能節(jié)省大量的工作累贤。

#與##的使用

# 會將宏參數(shù)轉(zhuǎn)換為一個字符串,簡單理解就是出現(xiàn)在宏定義中的#是把跟在后面的參數(shù)轉(zhuǎn)換長一個字符串

#define ERROR_LOG(msg) printf("error:#msg\n")
ERROR_LOG("add") => printf("error:"add"")

## 是一種分割鏈接方式叠穆,它的作用是先分隔,然后進行強制連接

#define TYPE(type, name) type name##_##type##_type
TYPE(int, a) => int a_int_type

如何節(jié)省工作量呢

比如有個數(shù)據(jù)結(jié)構(gòu)體臼膏,對于結(jié)構(gòu)體中的每一種數(shù)據(jù)都一個操作接口硼被,常規(guī)實現(xiàn)方式是每個接口都實現(xiàn)一次,這樣隨著數(shù)據(jù)項的增加渗磅,工作量會直線增加嚷硫,利用函數(shù)宏可以完美解決這個問題。

typede struct
{
    int nData1;
    int nData2;
    int nData3;
    ...
}TData;

#define DEFADDDATA(name, type) \
void Op##_##name(TData a,type data) \
{ \
    a.n##name += data;      \
}   

DEFADDDATA(Data1, int) 展開后為
void Op_Data1(TData a, int data)
{
    a.nData1 += data;
}   

按照上面所述始鱼,每增加一個數(shù)據(jù)項仔掸,只需要一次函數(shù)宏語句就可以解決,節(jié)省大量工作量医清。

函數(shù)宏的變長參數(shù)

宏可以像函數(shù)一樣起暮,帶可變參數(shù)。語法如下:

#define debug(format, ...)  printf(format, __VA_ARGS__)
debug("A message") => printf("A message",)

展開還有問題会烙,因為字符串后面沒有逗號
解決方法:

#define debug(format, ...) printf(format, ##__VA_ARGS__)

這里负懦,如果可變參數(shù)被忽略或為空,##操作將使預處理器去除掉它前面的那個逗號柏腻。

總結(jié)

宏定義是一把雙刃劍纸厉,用好了節(jié)省大量工作量,并使代碼結(jié)構(gòu)清晰五嫂,如果不好颗品,跳坑不斷,代碼結(jié)構(gòu)混亂贫导。
人生是在不斷跳坑抛猫,填坑的循環(huán)中成長。加油:⒌啤闺金!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市峰档,隨后出現(xiàn)的幾起案子败匹,更是在濱河造成了極大的恐慌寨昙,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掀亩,死亡現(xiàn)場離奇詭異舔哪,居然都是意外死亡,警方通過查閱死者的電腦和手機槽棍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門捉蚤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炼七,你說我怎么就攤上這事缆巧。” “怎么了豌拙?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵陕悬,是天一觀的道長。 經(jīng)常有香客問我按傅,道長捉超,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任唯绍,我火速辦了婚禮拼岳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘推捐。我一直安慰自己裂问,他們只是感情好侧啼,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布牛柒。 她就那樣靜靜地躺著,像睡著了一般痊乾。 火紅的嫁衣襯著肌膚如雪皮壁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天哪审,我揣著相機與錄音蛾魄,去河邊找鬼。 笑死湿滓,一個胖子當著我的面吹牛滴须,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叽奥,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扔水,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了朝氓?” 一聲冷哼從身側(cè)響起魔市,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤主届,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后待德,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體君丁,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年将宪,在試婚紗的時候發(fā)現(xiàn)自己被綠了绘闷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡较坛,死狀恐怖簸喂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情燎潮,我是刑警寧澤喻鳄,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站确封,受9級特大地震影響除呵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爪喘,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一颜曾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秉剑,春花似錦泛豪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至略水,卻和暖如春价卤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渊涝。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工慎璧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跨释。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓胸私,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鳖谈。 傳聞我的和親對象是個殘疾皇子岁疼,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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

  • 宏定義在C系開發(fā)中可以說占有舉足輕重的作用。底層框架自不必說蚯姆,為了編譯優(yōu)化和方便五续,以及跨平臺能力洒敏,宏被大量使用,可...
    你好自己閱讀 1,054評論 0 5
  • http://www.open-open.com/lib/view/open1390651437117.html ...
    Xtuphe閱讀 1,267評論 0 10
  • 目錄 一.預處理的工作方式... 3 1.1.預處理的功能... 3 1.2預處理的工作方式... 3 二.預處理...
    朱森閱讀 1,377評論 0 2
  • C中的預編譯宏定義 2009-02-10 作者: infobillows 來源:網(wǎng)絡 在將一個C源程序轉(zhuǎn)換為可執(zhí)行...
    白水灬煮一切閱讀 1,594評論 0 5
  • 昨晚大寶依然不聽話疙驾,回家給她買了愛吃的蛋糕凶伙,吃完晚飯非要下去遛狗,爺爺說今晚別下去啦它碎,復習功課明天考試函荣,不行就下去...
    平凡精靈閱讀 266評論 0 0