C++ 宏定義

定義宏

預(yù)處理器不是編譯器侥钳,預(yù)處理器主要完成文本替換的操作诡曙,預(yù)處理器都是用 #xxx 的寫法

# include  導(dǎo)入頭文件
#if if判斷操作
#elif
#else
#ifndef         如果沒(méi)有定義這個(gè)宏
#define        定義了一個(gè)宏
#ifdef          如果定義了這個(gè)宏
#endif              結(jié)束if
#undef            取消宏定義
#programa   定義編譯器的狀態(tài)

頭文件經(jīng)常有類似的聲明

#ifndef TEMPC_CUSTOMPTR_H
#define TEMPC_CUSTOMPTR_H
#pragma once

// other code......

#endif //TEMPC_CUSTOMPTR_H

作用和含義

T2.h

#ifndef TEMPC_T2_H // 如果沒(méi)有定義這個(gè)宏  解決循環(huán)拷貝的問(wèn)題
#define TEMPC_T2_H // 我就定義這個(gè)宏

#ifndef isRelease // 如果沒(méi)有isRelease這個(gè)宏
#define isRelease 0 // 是否是正式環(huán)境下 【我就定義isRelease這個(gè)宏】

#if isRelease == true
#define RELEASE // 正式環(huán)境下 定義RELEASE宏
#elif isRelease == false
#define DEBUG // 測(cè)試環(huán)境下  定義DEBUG宏

#endif // 結(jié)束里面的if
#endif // 結(jié)束里面的if

#endif //TEMPC_T2_H // 結(jié)束外面的if

上面頭文件的聲明门怪,解決是循環(huán)引用問(wèn)題诅妹,比如芜抒,我們?cè)?項(xiàng)目文件珍策,ahead.h 引入了 a.cpp, 同時(shí)a.cpp 引入了ahead.h. 結(jié)果 宏定義是文本拷貝替換,就導(dǎo)致了循環(huán)引用宅倒,為了避免這種問(wèn)題發(fā)生需要定義這種宏定義

#include <iostream>
#include "T2.h"
using namespace std;

int main() {

    // if 條件判斷
    // ifdef xxx 是否定義了xxx這個(gè)宏

#ifdef DEBUG // 是否定義了DEBUG這個(gè)宏
    cout << "在測(cè)試環(huán)境下攘宙,迭代功能" << endl;
    // 省略 500行 ...

#else RELEASE
    cout << "在正式環(huán)境下,功能上下中" << endl;
    // 省略 500行 ...

#endif // 結(jié)束IF

}

宏的取消 #undef

#include <iostream>
using namespace std;

int main() {
    int i = 1;

#ifndef DAVID // 如果沒(méi)有定義這個(gè)宏
#define DAVID // 我就定義宏
#ifdef DAVID // 是否定義了這個(gè)宏
    for(int i = 0;i<6; ++i){
        cout << "David ① " << i << endl;
    }
#ifdef DAVID // 是否定義了這個(gè)宏
    for(int i = 0;i<6;++i){
        cout << "David ② " << i << endl;
    }
#undef DAVID // 取消宏的定義拐迁,下面的代碼蹭劈,就沒(méi)法用這個(gè)宏了,相當(dāng)于:沒(méi)有定義過(guò)DERRY宏
#ifdef DAVID
    cout << "你定義了DAVID宏" << endl;
#else
    cout << "你沒(méi)有定義了DAVID宏" << endl;
#endif
#endif
#endif
#endif
    return 0;
}

宏與編譯

  1. 預(yù)處理階段线召,處理宏(預(yù)處理器)

宏定義展開铺韧,比如#include<xxx.h> 將.h 拷貝到當(dāng)前文件。宏替換缓淹,就是在預(yù)處理去掉宏代碼哈打,變成宏定義的邏輯代碼。

  1. 預(yù)編譯 代碼的檢查

  2. 匯編階段

  3. 鏈接階段(生成靜態(tài)庫(kù)讯壶,后者動(dòng)態(tài)庫(kù))

  4. 可執(zhí)行文件

宏變量

宏變量 真實(shí)開發(fā)中:宏都是大寫

#include <iostream>
using namespace std;

#define VALUE_I 9527
#define VALUE_S "AAA"
#define VALUE_F 545.3f

int main() {
    int i = VALUE_I; // 預(yù)處理階段 宏會(huì)直接完成文本替換工作料仗,替換后的樣子:int i = 9527;
    string s = VALUE_S; // 預(yù)處理階段 宏會(huì)直接完成文本替換工作,替換后的樣子:string s = "AAA";
    float f = VALUE_F; // 預(yù)處理階段 宏會(huì)直接完成文本替換工作伏蚊,替換后的樣子:float f = 545.3f;

    return 0;
}

宏函數(shù)

優(yōu)點(diǎn)立轧,不會(huì)進(jìn)棧,出棧,直接文本替換氛改。不會(huì)有函數(shù)調(diào)用開銷匀借。
缺點(diǎn),會(huì)導(dǎo)致代碼的體積變大平窘,不停的拷貝文本代碼

#include <iostream>
using namespace std;
#define SHOW(V) cout << V << endl;
#define ADD(n1, n2) n1 + n2
#define CHE(n1, n2) n1 * n2 // 故意制作問(wèn)題吓肋,因?yàn)樗銛?shù)運(yùn)算規(guī)則有順序

#define LOGIN(V) if(V==1){  \
cout << "滿足 你輸入的是:" << V << endl;        \
} else {                                        \
    cout << "不滿足 你輸入的是:" << V << endl;       \
}// 這個(gè)是結(jié)尾,不需要加 \

int main() {
    SHOW(8);
    SHOW(8.8f);
    SHOW(8.99);

    int r = ADD(1, 2);
    cout << r << endl;
    r = ADD(1+1,2+2);
    cout << r << endl;

    r = CHE(1+1,2+2);// 文本替換 1+1*2+2 = 5
    cout << r << endl;// 二義性瑰艘,我們邏輯是認(rèn)為8是鬼,但是實(shí)際是5


    LOGIN(0);
    LOGIN(0);
    LOGIN(0);
    LOGIN(0);
    LOGIN(0);
    LOGIN(0);
    //LOGIN(0) 替換大量文本,代碼體積增大
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載紫新,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者均蜜。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芒率,隨后出現(xiàn)的幾起案子囤耳,更是在濱河造成了極大的恐慌,老刑警劉巖偶芍,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件充择,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡匪蟀,警方通過(guò)查閱死者的電腦和手機(jī)椎麦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)材彪,“玉大人观挎,你說(shuō)我怎么就攤上這事《位” “怎么了嘁捷?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)显熏。 經(jīng)常有香客問(wèn)我雄嚣,道長(zhǎng),這世上最難降的妖魔是什么佃延? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任现诀,我火速辦了婚禮,結(jié)果婚禮上履肃,老公的妹妹穿的比我還像新娘。我一直安慰自己坐桩,他們只是感情好尺棋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般膘螟。 火紅的嫁衣襯著肌膚如雪成福。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天荆残,我揣著相機(jī)與錄音奴艾,去河邊找鬼。 笑死内斯,一個(gè)胖子當(dāng)著我的面吹牛蕴潦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俘闯,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼潭苞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了真朗?” 一聲冷哼從身側(cè)響起此疹,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遮婶,沒(méi)想到半個(gè)月后蝗碎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旗扑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年衍菱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肩豁。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡脊串,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出清钥,到底是詐尸還是另有隱情琼锋,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布祟昭,位于F島的核電站缕坎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏篡悟。R本人自食惡果不足惜谜叹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搬葬。 院中可真熱鬧荷腊,春花似錦、人聲如沸急凰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至疾忍,卻和暖如春乔外,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背一罩。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工杨幼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人聂渊。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓差购,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親歧沪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子歹撒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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