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

C++如何在變量前面加#

 更新時(shí)間:2023年08月07日 15:01:16   作者:眼中皆星辰  
這篇文章主要介紹了C++如何在變量前面加#問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

C++中變量前面加#

C++中變量前面加#的作用為把變量字符串化。

看如下的幾個(gè)例子

例1:代碼如下

#include <iostream>
using namespace std;
#define operation(NAME) cout<<#NAME<<" = "<<NAME<<endl;
int main()
{
    int AB_CD=1;
    operation(AB_CD);
}

結(jié)果如下:

例2:代碼如下

#include <iostream>
#include<string.h>
using namespace std;
#define operation(NAME) string a=#NAME;
int main()
{
    operation(AB_CD);
    cout << a << endl;
}

結(jié)果如下:

C++中#(一個(gè)#號(hào))和##(兩個(gè)#號(hào))的用法和作用

關(guān)于一個(gè)#號(hào)

在C語言的宏中,#的功能是將其后面的宏參數(shù)進(jìn)行字符串化操作, 簡(jiǎn)單說就是對(duì)他所引用的宏變量通過替換后再其左右各加上一個(gè)雙引用。

例子:

# define WARNIF(EXP) \
do{ \
? ? if (EXP) \
? ? { ? ?\ ? ?
? ? ? ? fprintf(stderr, "warning:" #EXP "\n"); \
? ? } ? \ ? ?
}while(0) ? ?

在實(shí)際使用中會(huì)出現(xiàn)下面所示的替換過程:

WARN_IF(div == 0); 被替換成以下代碼
do{
? ? if (div == 0)?
? ? { ? ? ? ?
? ? ? ? fprintf(stderr, "warning:" "div == 0" "\n");?
? ? } ? ? ??
}while(0)

關(guān)于兩個(gè)#號(hào)

##被稱為連接符,用來將兩個(gè)Token鏈接成一個(gè)Token.注意這里的連接的對(duì)象時(shí)Token就行, 而不一定是宏的變量。比如你要做一個(gè)菜單項(xiàng)命令名和函數(shù)指針組成的結(jié)構(gòu)體的數(shù)組,并且希望在函數(shù)和菜單項(xiàng)命令名直

接有直觀的名字上的關(guān)系, 那么下面的代碼就非常實(shí)用

struct command
{
? ? char *name;
? ? void (*function)(void);
};
#define COMMAND(NAME){NAME, NAME##_command}

然后就用一些預(yù)定義好的命令來方便的初始化一個(gè)command結(jié)構(gòu)的數(shù)據(jù)了:

struct command commands[] = {
????COMMAND(quit),
????COMMAND(help),
????...
}

COMMAND宏在這里充當(dāng)一個(gè)代碼生成器的作用,這樣可以在一定程度上減少代碼的密度, 間接的也可以減少粗心所造成的錯(cuò)誤。

我們還可以n個(gè)##符號(hào)鏈接n+1個(gè)Token,這個(gè)特性也是#符號(hào)所不具備的。

例如:

#define LINK_MULTIPLE(a, b, c, d) a##_##b##_##c##_###d
typedef struct_record_type LINK_MULTIPLE(name, company, position, salary);
//展開內(nèi)容為 : typedef struct_record_type name_company_position_salary;

關(guān)于...的使用

...在C語言中被稱為變參宏 

#define myprintf(templt, ...) ?fprintf(stderr, templt, ##__VA_ARGS__)

這是##這個(gè)連接符充當(dāng)?shù)淖饔镁褪钱?dāng)__VA_ARGS__為空的時(shí)候, 消除前面的那個(gè)逗號(hào)。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解C語言讀取文件求某一列的平均值

    詳解C語言讀取文件求某一列的平均值

    本文粗淺比較了C語言中常用的幾種讀取文件的函數(shù)的效率,并給出了幾段求取某列平均值的代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多度進(jìn)步
    2022-02-02
  • 深入剖析C++中的struct結(jié)構(gòu)體字節(jié)對(duì)齊

    深入剖析C++中的struct結(jié)構(gòu)體字節(jié)對(duì)齊

    要求數(shù)據(jù)內(nèi)存的起始地址的值是某個(gè)數(shù)k的倍數(shù),這就是所謂的內(nèi)存對(duì)齊,本文就來深入剖析C++中的struct結(jié)構(gòu)體字節(jié)對(duì)齊,需要的朋友可以參考下
    2016-05-05
  • c++重載的詳細(xì)總結(jié)

    c++重載的詳細(xì)總結(jié)

    作為成員函數(shù)重載符,對(duì)于雙目操作符重載函數(shù)只需一個(gè)形參,對(duì)于單目操作符重載函數(shù)不需要形參
    2013-09-09
  • 關(guān)于C語言 const 和 define 區(qū)別

    關(guān)于C語言 const 和 define 區(qū)別

    這篇文章主要介紹了關(guān)于C語言 const 和 define 區(qū)別 的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容
    2021-09-09
  • C++?qsort函數(shù)排序與冒泡模擬實(shí)現(xiàn)流程詳解

    C++?qsort函數(shù)排序與冒泡模擬實(shí)現(xiàn)流程詳解

    qsort是一個(gè)庫函數(shù),基于快速排序算法實(shí)現(xiàn)的一個(gè)排序的函數(shù),下面這篇文章主要給大家介紹了關(guān)于C語言qsort()函數(shù)使用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • C++ 如何使用RapidJson 寫入文件

    C++ 如何使用RapidJson 寫入文件

    RapidJSON 是只有頭文件的 C++ 庫, 不需要編譯, 可以直接在項(xiàng)目中使用, 只需把 include/rapidjson 目錄復(fù)制至系統(tǒng)或項(xiàng)目的 include 目錄即可,下面給大家分享C++ 如何使用RapidJson 寫入文件,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • C++鏈表類的封裝詳情介紹

    C++鏈表類的封裝詳情介紹

    這篇文章主要介紹了C++鏈表類的封裝,文章基于C++的相關(guān)資料展開主題的詳細(xì)內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • VS2022添加代碼模板的實(shí)現(xiàn)步驟(圖文)

    VS2022添加代碼模板的實(shí)現(xiàn)步驟(圖文)

    使用代碼模板即可實(shí)現(xiàn)像內(nèi)置函數(shù)那樣,只需寫幾個(gè)字母,便能提示自動(dòng)補(bǔ)全,本文主要介紹了VS2022添加代碼模板的實(shí)現(xiàn)步驟,感興趣的可以了解一下
    2024-06-06
  • C++虛函數(shù)表實(shí)例分析

    C++虛函數(shù)表實(shí)例分析

    這篇文章主要介紹了C++虛函數(shù)表,對(duì)多態(tài)中用到的虛函數(shù)表進(jìn)行了比較通俗的實(shí)例分析,需要的朋友可以參考下
    2014-09-09
  • C語言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲詳解

    C語言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲詳解

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論