最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

了解#和##

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

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

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

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

struct ABC
{

};

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

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

宏變量亂入的情況

還是剛剛的例子,

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

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

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

替換規(guī)則

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

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.

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

修復(fù)方法

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

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

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

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

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

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

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

相關(guān)文章

  • C++中vector和數(shù)組之間的轉(zhuǎn)換及其效率問題詳解

    C++中vector和數(shù)組之間的轉(zhuǎn)換及其效率問題詳解

    c++?vector轉(zhuǎn)數(shù)組是一種將vector容器的元素轉(zhuǎn)換為數(shù)組的方法,主要能幫助提高程序的性能和效率,下面這篇文章主要給大家介紹了關(guān)于C++中vector和數(shù)組之間的轉(zhuǎn)換及其效率問題的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • ReSharper 的安裝使用詳細(xì)教程

    ReSharper 的安裝使用詳細(xì)教程

    resharper安裝教程是關(guān)于vs2012一個非常好用的插件的安裝教程,建議大家嘗試安裝,今天通過本教程幫助大家學(xué)習(xí)ReSharper 的安裝使用詳細(xì)教程,感興趣的朋友一起看看吧
    2021-06-06
  • 用C語言的泛型實現(xiàn)交換兩個變量值

    用C語言的泛型實現(xiàn)交換兩個變量值

    在日常編程里面經(jīng)常會遇到交換兩個變量的內(nèi)容的任務(wù),對于泛型類型而言有兩種泛型策略來實現(xiàn),下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)。
    2016-08-08
  • 用C語言實現(xiàn)掃雷小游戲

    用C語言實現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了用C語言實現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言常見排序算法歸并排序

    C語言常見排序算法歸并排序

    這篇文章主要介紹了C語言常見排序算法歸并排序,歸并排序是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法的一個非常典型的應(yīng)用
    2022-07-07
  • C++類的靜態(tài)成員初始化詳細(xì)講解

    C++類的靜態(tài)成員初始化詳細(xì)講解

    通常靜態(tài)數(shù)據(jù)成員在類聲明中聲明,在包含類方法的文件中初始化.初始化時使用作用域操作符來指出靜態(tài)成員所屬的類.但如果靜態(tài)成員是整型或是枚舉型const,則可以在類聲明中初始化
    2013-09-09
  • 深入解析 C++中std::stoul 函數(shù)

    深入解析 C++中std::stoul 函數(shù)

    std::stoul是 C++ 標(biāo)準(zhǔn)庫中的一個字符串轉(zhuǎn)換函數(shù),它用于將?std::string?或?std::wstring?轉(zhuǎn)換為?unsigned long?類型的整數(shù),下面就來介紹一下
    2025-04-04
  • 使用OpenGL創(chuàng)建窗口的示例詳解

    使用OpenGL創(chuàng)建窗口的示例詳解

    OpenGL,也就是Open?Graphics?Library。其主要就是用于我們?nèi)ヤ秩?D、3D矢量圖形的一種跨語言、跨平臺的應(yīng)用程序編程接口,這篇文章主要介紹了使用OpenGL創(chuàng)建窗口,需要的朋友可以參考下
    2022-04-04
  • 詳解C++中的ANSI與Unicode和UTF8三種字符編碼基本原理與相互轉(zhuǎn)換

    詳解C++中的ANSI與Unicode和UTF8三種字符編碼基本原理與相互轉(zhuǎn)換

    在C++編程中,我們有時需要去處理字符串編碼的相關(guān)問題,常見的字符編碼有ANSI窄字節(jié)編碼、Unicode寬字節(jié)編碼及UTF8可變長編碼。很多人在處理字符串編碼問題時都會有疑惑,即便是有多年工作經(jīng)驗的朋友也可能搞不清楚。所以有必要講一下這三種字符編碼以及如何去使用它們
    2021-11-11
  • C++ clock()解析如何使用時鐘計時的應(yīng)用

    C++ clock()解析如何使用時鐘計時的應(yīng)用

    本篇文章是對c++中的clock()函數(shù)進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06

最新評論

甘孜| 泾川县| 乌兰县| 阜康市| 文山县| 万年县| 上犹县| 南宁市| 肥东县| 肥城市| 镇雄县| 永兴县| 民勤县| 房产| 工布江达县| 工布江达县| 钦州市| 红安县| 长子县| 隆子县| 蚌埠市| 独山县| 泾川县| 扎鲁特旗| 平安县| 章丘市| 民和| 隆尧县| 台南市| 甘肃省| 兰考县| 昭觉县| 灵璧县| 韩城市| 封丘县| 临城县| 昌宁县| 龙山县| 家居| 龙井市| 潍坊市|