C++宏的使用

"##"與"#"

看一個(gè)栗子??:

#include <iostream>

int main(int argc, char** argv) {
    float dataA[2][2] = {{1,2}, {3,4}};
    float dataB[2][2] = {{5,6}, {7,8}};
#define ELEMENT(w,h)        \
    a##w##h = dataA[w][h],  \
    b##w##h = dataB[w][h]
    float ELEMENT(0,0),ELEMENT(0,1),ELEMENT(1,0),ELEMENT(1,1);
#undef ELEMENT
    std::cout << a00 << " " << a01 << " " << b00 << " " << b01 << std::endl;
}

上述示例中殖卑,ELEMENT(w,h)宏中“a##w##h”和"b##w##h"表示字符串"a00"(w=0,h=0)或"b11"(w=1,h=1),"##"符號(hào)把兩個(gè)宏參數(shù)貼合在一起;

相對(duì)地坊萝,“#”可以把宏參數(shù)變?yōu)橐粋€(gè)字符串孵稽,以下是一個(gè)將枚舉轉(zhuǎn)換為字符串的示例:

#include <iostream>

enum Color {
    RED, YELLOW, GREEN
};

std::string get_color_str(Color c) {
#define STR(c)      \
    case c:         \
        return #c;  \
        break

    switch(c) {
        STR(RED);
        STR(YELLOW);
        STR(GREEN);
    }

#undef STR
}

int main(int argc, char** argv) {
    Color c = RED;
    std::cout << get_color_str(c) << std::endl; 
}
為什么要即時(shí)#undef

#define是在編譯期展開的,類似于文件的查找替換十偶,它不尊重任何C++范圍菩鲜。所以為了避免宏的泛濫,要給宏手動(dòng)增加作用域扯键,即#define#undef之間的范圍睦袖,同時(shí)為了避免錯(cuò)誤,應(yīng)當(dāng)盡量以大寫來命名宏荣刑。

do{...}while(0)技巧

do{...}while(0)是一個(gè)非常好用的增加程序健壯性的技巧馅笙,能夠避免很多意想不到的問題,參見https://dream-notes.readthedocs.io/language/cpp/cpp_micro.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厉亏,一起剝皮案震驚了整個(gè)濱河市董习,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌爱只,老刑警劉巖皿淋,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異恬试,居然都是意外死亡窝趣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門训柴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哑舒,“玉大人,你說我怎么就攤上這事幻馁∠赐遥” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵仗嗦,是天一觀的道長(zhǎng)膘滨。 經(jīng)常有香客問我,道長(zhǎng)稀拐,這世上最難降的妖魔是什么火邓? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上贡翘,老公的妹妹穿的比我還像新娘蹈矮。我一直安慰自己,他們只是感情好鸣驱,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布泛鸟。 她就那樣靜靜地躺著,像睡著了一般踊东。 火紅的嫁衣襯著肌膚如雪北滥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天闸翅,我揣著相機(jī)與錄音再芋,去河邊找鬼。 笑死坚冀,一個(gè)胖子當(dāng)著我的面吹牛济赎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播记某,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼司训,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了液南?” 一聲冷哼從身側(cè)響起壳猜,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滑凉,沒想到半個(gè)月后统扳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡畅姊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年咒钟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片若未。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盯腌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出陨瘩,到底是詐尸還是另有隱情,我是刑警寧澤级乍,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布舌劳,位于F島的核電站,受9級(jí)特大地震影響玫荣,放射性物質(zhì)發(fā)生泄漏甚淡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一捅厂、第九天 我趴在偏房一處隱蔽的房頂上張望贯卦。 院中可真熱鬧资柔,春花似錦、人聲如沸撵割。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)啡彬。三九已至羹与,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間庶灿,已是汗流浹背纵搁。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留往踢,地道東北人腾誉。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像峻呕,于是被迫代替她去往敵國(guó)和親利职。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,701評(píng)論 0 3
  • C中的預(yù)編譯宏定義 2009-02-10 作者: infobillows 來源:網(wǎng)絡(luò) 在將一個(gè)C源程序轉(zhuǎn)換為可執(zhí)行...
    白水灬煮一切閱讀 1,608評(píng)論 0 5
  • ^函數(shù)重載的匹配: 當(dāng)函數(shù)名被重載后山上,函數(shù)的匹配過程:首先尋找能精確匹配的函數(shù)眼耀,如果未能精確匹配,則嘗試...
    魯大帥閱讀 1,020評(píng)論 0 1
  • http://www.open-open.com/lib/view/open1390651437117.html ...
    Xtuphe閱讀 1,268評(píng)論 0 10
  • 小的時(shí)候可能因?yàn)槎藴氲臅r(shí)候佩憾,父母多看一眼就覺得心里有愧哮伟,眼淚隨之掉下來。 中學(xué)的時(shí)候妄帘,因?yàn)槔蠋煶榈膯栴}去講臺(tái)上做...
    一天又一篇閱讀 858評(píng)論 0 1