欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析C++中的間接宏函數(shù)

 更新時(shí)間:2021年04月02日 08:35:20   作者:老胡寫代碼  
這篇文章主要介紹了C++中的間接宏函數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

宏函數(shù)對(duì)于每個(gè)C++程序員都決不陌生,就算是初出茅廬的C++程序員也知道如何定義、使用宏函數(shù)。

但是當(dāng)初學(xué)者看到類似于以下這種宏函數(shù)嵌套的時(shí)候,可能還是會(huì)比較嘀咕,

#define CONVERTSTR(x) #x
#define CONVERTSTR2(x) CONVERTSTR(x)

第二個(gè)宏函數(shù)所做的事情不就是再一次調(diào)用上面的宏函數(shù)嗎,這難道不屬于畫蛇添足嗎?這樣做有什么意義呢?別急,我們慢慢來捋一下。

了解#和##

要想熟練的寫出宏函數(shù),了解其中的操作符必不可少,在預(yù)編譯體系自定義的幾個(gè)操作符中, #和##比較特殊,它們的作用是:

將標(biāo)識(shí)符轉(zhuǎn)換為字符串,它又被稱為字符串化操作符,用法如下

#define CONVERTSTR(x) #x
string s3 { CONVERTSTR(4) }; //這里CONVERTSTR(4)被擴(kuò)展為"4"

將不同的標(biāo)識(shí)符連接起來,它被稱為符號(hào)連接操作符,用法如下

struct ABC
{

};

#define DECLARE_MAKE(x) x* Make_##x() {return new x();}
DECLARE_MAKE(ABC) //被擴(kuò)展為 ABC* Make_ABC{return new ABC();}
ABC * ap = Make_ABC();

可見這兩操作符的運(yùn)算結(jié)果取決于傳入的標(biāo)識(shí)符的名稱,那么如果傳入的標(biāo)識(shí)符本身就是一個(gè)宏變量呢?

宏變量亂入的情況

還是剛剛的例子,

#define CONVERTSTR(x) #x
#define VAR 10
std::cout << CONVERTSTR(VAR);

猜猜,這個(gè)時(shí)候的輸出是多少?10 還是 VAR?
按照預(yù)處理器替換的原則,VAR被替換成10,接著10被轉(zhuǎn)換為"10",但是真是這樣嗎?

運(yùn)行之后發(fā)現(xiàn),輸出是VAR不是10,為什么呢?

替換規(guī)則

這是因?yàn)楫?dāng)宏函數(shù)中,如果包含了#或者##,替換規(guī)則會(huì)比較特殊,引用一段原文如下:

After the arguments for the invocation of a function-like macro have been identified,
argument substitution takes place. A parameter in the replacement list, unless preceded by
a # or ## preprocessing token or followed by a ## preprocessing token (see below), is
replaced by the corresponding argument after all the macros contained therein have been
expanded. Before being substituted, each argument's preprocessing tokens are completely
macro replaced as if they formed the rest of the preprocessing file; no other preprocessing
tokens is available.

簡(jiǎn)而言之,對(duì)于宏函數(shù)來說,一般情況下當(dāng)看到函數(shù)體的時(shí)候,參數(shù)替換就已經(jīng)完成了(像用10替換VAR),但是對(duì)于有操作符#和##的參數(shù),這個(gè)參數(shù)替換步驟就不會(huì)發(fā)生,所以CONVERTSTR(VAR)只會(huì)擴(kuò)展為 "VAR"而不會(huì)擴(kuò)展為"10"

修復(fù)方法

其實(shí)講到這里答案已經(jīng)很明顯了,使用間接宏函數(shù)能完美解決這個(gè)問題

#define CONVERTSTR(x) #x
#define CONVERTSTR2(x) CONVERTSTR(x)

在原有函數(shù)的基礎(chǔ)上再定義一個(gè)包裝函數(shù),這個(gè)包裝函數(shù)并沒有任何#或者##,這樣就確保了參數(shù)可以正確展開,接著轉(zhuǎn)發(fā)請(qǐng)求給真正需要使用的那個(gè)函數(shù)。

#define VAR 10
std::cout << CONVERTSTR2(VAR);

這樣就能確保在使用VAR調(diào)用函數(shù)的時(shí)候它已經(jīng)被正確展開了。

這就是間接宏函數(shù)和為什么要使用它們的原因,希望下次看到它們的時(shí)候不要再覺得這是畫蛇添足了喲。

到此這篇關(guān)于C++中的間接宏函數(shù)的文章就介紹到這了,更多相關(guān)C++間接宏函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)鏈表貪吃蛇

    C語(yǔ)言實(shí)現(xiàn)鏈表貪吃蛇

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)鏈表貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 你真的知道C++對(duì)象大小嗎?

    你真的知道C++對(duì)象大小嗎?

    這篇文章主要給大家介紹了關(guān)于C++對(duì)象大小的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C++結(jié)構(gòu)體中變長(zhǎng)數(shù)組的使用問題分解刨析

    C++結(jié)構(gòu)體中變長(zhǎng)數(shù)組的使用問題分解刨析

    變長(zhǎng)數(shù)組在C++中指的是集合(也叫容器)如vector就是C語(yǔ)言中,所有的數(shù)組都不定長(zhǎng),沒有下標(biāo)越界的概念,數(shù)組實(shí)質(zhì)就是一個(gè)指針(由數(shù)組名充當(dāng))因此C語(yǔ)言中數(shù)組的長(zhǎng)度沒有任何意義平常在C語(yǔ)言中講的不定長(zhǎng)數(shù)組,其實(shí)就是指針
    2022-08-08
  • c++中的const_cast用法大全

    c++中的const_cast用法大全

    const_cast轉(zhuǎn)換符是用來移除變量的const或volatile限定符。對(duì)于后者,我不是太清楚,因?yàn)樗婕暗搅硕嗑€程的設(shè)計(jì),今天重點(diǎn)給大家介紹c++中的const_cast用法大全,需要的朋友參考下吧
    2021-07-07
  • 詳解C語(yǔ)言中的動(dòng)態(tài)內(nèi)存管理

    詳解C語(yǔ)言中的動(dòng)態(tài)內(nèi)存管理

    對(duì)于數(shù)據(jù)的存儲(chǔ)我們可以靜態(tài)存儲(chǔ),也可以動(dòng)態(tài)存儲(chǔ),兩種方式都有自己特有的好處,這篇文章教我們?nèi)绾瓦M(jìn)行動(dòng)態(tài)的數(shù)據(jù)存儲(chǔ)!!?。「信d趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-12-12
  • 共用體的定義與應(yīng)用詳細(xì)解析

    共用體的定義與應(yīng)用詳細(xì)解析

    共同體的定義類似結(jié)構(gòu)體,不過共同體的所有成員都在同一段內(nèi)存中存放,起始地址一樣,并且同一時(shí)刻只能使用其中的一個(gè)成員變量
    2013-08-08
  • C/C++ 中extern關(guān)鍵字詳解

    C/C++ 中extern關(guān)鍵字詳解

    這篇文章主要介紹了C/C++ 中extern關(guān)鍵字詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C 語(yǔ)言基礎(chǔ)教程(我的C之旅開始了)[十]

    C 語(yǔ)言基礎(chǔ)教程(我的C之旅開始了)[十]

    C 語(yǔ)言基礎(chǔ)教程(我的C之旅開始了)[十]...
    2007-02-02
  • C++中圖片重命名實(shí)現(xiàn)代碼

    C++中圖片重命名實(shí)現(xiàn)代碼

    這篇文章主要介紹了C++中圖片重命名實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2017-05-05
  • C語(yǔ)言實(shí)現(xiàn)萬(wàn)年歷

    C語(yǔ)言實(shí)現(xiàn)萬(wàn)年歷

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)萬(wàn)年歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評(píng)論