在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言-#和##的具體用法

嵌入式那些事 ? 來(lái)源:嵌入式那些事 ? 2023-12-19 12:54 ? 次閱讀

C語(yǔ)言中,在宏里面使用’#’和’##’有它非常神奇的作用。在宏定義的替換的過(guò)程中,#號(hào)可以作為一個(gè)預(yù)處理運(yùn)算符,把宏參數(shù)轉(zhuǎn)換為字符串。##運(yùn)算符則可以把兩個(gè)宏參數(shù)組合在一起。下面就來(lái)說(shuō)說(shuō)具體的用法。

1、一般用法

我們使用#把宏參數(shù)變?yōu)橐粋€(gè)字符串,用##把兩個(gè)宏參數(shù)貼合在一起。

下面的代碼是演示代碼:

#include

#defineSTRING(s)#s
#defineCONNECT(a,b)(int)(a##e##b)

intmain(void)
{
//輸出字符串"abcdefg"
printf("string:%s
",STRING(abcdefg));

//2e3輸出:2000
printf("connect:%d
",CONNECT(2,3));

return0;
}

運(yùn)行結(jié)果如下圖:

d2c6516a-9e26-11ee-8b88-92fbcf53809c.png

2016-03-21_171313

2、當(dāng)宏參數(shù)是另一個(gè)宏的時(shí)候

需要注意的是:凡是宏定義里有用'#'或'##'的地方,宏參數(shù)是不會(huì)再展開(kāi)。

(1)、非’#’和’##’的情況

#include

#defineTOW(2)
#defineMUL(a,b)(a*b)

intmain(void)
{
printf("%d*%d=%d
",TOW,TOW,MUL(TOW,TOW));

return0;
}

上面代碼中打印那行的宏會(huì)被展開(kāi)為:

printf("%d*%d=%d
",(2),(2),((2)*(2)));

(2)、當(dāng)有'#'或'##'的時(shí)候

#include
#include

#defineA(2)
#defineSTR(s)#s
#defineCONS(a,b)(int)(a##e##b)

intmain(void)
{
//INT_MAX這行會(huì)被展開(kāi)為:printf("intmax:%s
","INT_MAX");
printf("intmax:%s
",STR(INT_MAX));

//這一行會(huì)被展開(kāi)為:printf("%s
",(int)(AeA));
printf("%s
",CONS(A,A));

return0;
}

上面的代碼在編譯時(shí)會(huì)失敗,INT_MAX和A都不會(huì)再被展開(kāi),然而解決這個(gè)問(wèn)題的方法也很簡(jiǎn)單。加多一層中間轉(zhuǎn)換宏。加這層宏的用意是把所有宏的參數(shù)在這層里全部展開(kāi),那么在轉(zhuǎn)換宏里的那一個(gè)宏(_STR)就能得到正確的宏參數(shù)。

#include
#include

#defineA2
#define_STR(s)#s
#defineSTR(s)_STR(s)//轉(zhuǎn)換宏
#define_CONS(a,b)(int)(a##e##b)
#defineCONS(a,b)_CONS(a,b)//轉(zhuǎn)換宏

intmain(void)
{
//INT_MAX,int型的最大值,為一個(gè)變量
printf("intmax:%s
",STR(INT_MAX));

printf("CONS(A,A):%d
",CONS(A,A));

return0;
}

其中代碼:

printf("intmax:%s
",STR(INT_MAX));

輸出為:int max: 2147483647,STR(INT_MAX) ---> _STR(2147483647) 然后再轉(zhuǎn)換成字符串。

第二個(gè)輸出代碼:

printf("CONS(A,A):%d
",CONS(A,A));

輸出為:CONS(A, A):200,CONS(A, A) ---> _CONS(2, 2) ---> int(2e2)。

3、'#'和'##'的一些應(yīng)用特例

(1)、合并匿名變量名

#include

#define___ANONYMOUS1(type,var,line)typevar##line
#define__ANONYMOUS0(type,line)___ANONYMOUS1(type,_anonymous,line)
#defineANONYMOUS(type)__ANONYMOUS0(type,__LINE__)

intmain(void)
{
ANONYMOUS(staticint);

_anonymous9=666;

printf("_anonymous9:%d
",_anonymous9);

return0;
}

上述代碼:ANONYMOUS(static int);最終展開(kāi)為:static int _anonymous9; // 9表示該行行號(hào);,下面分析下具體的展開(kāi)過(guò)程:

第一次展開(kāi):ANONYMOUS(static int); ---> __ANONYMOUS0(static int, __LINE__);;

第二次展開(kāi):__ANONYMOUS0(static int, __LINE__); ---> ___ANONYMOUS1(static int, _anonymous, 9);;

第三次展開(kāi):___ANONYMOUS1(static int, _anonymous, 9); ---> static int _anonymous9;;

對(duì)于宏的展開(kāi)過(guò)程,每次只能解開(kāi)當(dāng)前層的宏,所以__LINE__在第二層才能被解開(kāi)。

(2)、獲取文件名

#include

#define_GET_FILENAME(filename)#filename
#defineGET_FILENAME(filename)_GET_FILENAME(filename)

intmain(void)
{
charfilename[]=GET_FILENAME(__FILE__);

printf("filename:%s
",filename);

return0;
}

當(dāng)然了,上述的宏也可以獲取__DATE__,__LINE__等宏實(shí)際對(duì)應(yīng)的值,上面專(zhuān)門(mén)定義了一個(gè)數(shù)組來(lái)存儲(chǔ)轉(zhuǎn)換后的值,實(shí)際使用時(shí)是否定義數(shù)組可自行安排。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7630

    瀏覽量

    140560
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    589

    瀏覽量

    21153
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4891

    瀏覽量

    70309
  • 運(yùn)算符
    +關(guān)注

    關(guān)注

    0

    文章

    172

    瀏覽量

    11370

原文標(biāo)題:C語(yǔ)言-#和##的神奇作用

文章出處:【微信號(hào):嵌入式那些事,微信公眾號(hào):嵌入式那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    C語(yǔ)言typedef與#define的用法和區(qū)別

    C語(yǔ)言編程中,typedef 和 #define是最常用語(yǔ)句,可能很多工作過(guò)幾年的工程師都沒(méi)有去深究過(guò)它們的一些用法和區(qū)別。
    發(fā)表于 10-12 10:39 ?870次閱讀

    plsy指令具體用法

    、WAV等。下面將詳細(xì)介紹plsy的用法。 安裝: 在使用plsy之前,首先需要在Unix系統(tǒng)中安裝。你可以通過(guò)在終端上運(yùn)行以下命令來(lái)安裝plsy: sudo apt-get install plsy
    的頭像 發(fā)表于 12-08 14:10 ?2807次閱讀

    誰(shuí)知道BAV99的具體功能和用法

    本帖最后由 gk320830 于 2015-3-9 20:41 編輯 誰(shuí)知道BAV99的具體用法
    發(fā)表于 09-07 09:33

    discrete filter 與discrete transfer 兩者的具體用法

    請(qǐng)教一哈大俠們:能不能舉一下具體的例子來(lái)說(shuō)明兩個(gè)的具體用法呀!!兩個(gè)的圖標(biāo)分別如下:先謝謝哈!!
    發(fā)表于 01-03 19:45

    求教這個(gè)軟鍵盤(pán)的具體用法

    這個(gè)軟鍵盤(pán)的具體用法,謝謝。
    發(fā)表于 09-30 21:28

    C語(yǔ)言的位操作在STM32f1單片機(jī)編程的具體應(yīng)用 精選資料推薦

    C語(yǔ)言的位操作在STM32f1單片機(jī)編程的具體應(yīng)用前言:熟練掌握位操作是學(xué)習(xí)stm32入門(mén)的必備技術(shù),位操作在單片機(jī)編程中格外重要,下面我就分別詳細(xì)介紹C
    發(fā)表于 07-14 07:31

    STM32CUBEMX具體詳細(xì)的用法

    所需工具1、MATLAB 2018b2、STM32硬件支持工具下載連接:STM32CUBEMX(用于配置STM32資源)下載連接:和3僅僅是在生成c語(yǔ)言中作為一個(gè)必須輔助的工具,具體詳細(xì)的用法
    發(fā)表于 08-11 06:53

    MCS51匯編中的DATA是偽指令嗎?具體用法是什么?

    MCS51匯編中的DATA是偽指令嗎?具體用法是什么?
    發(fā)表于 11-02 08:17

    C語(yǔ)言結(jié)構(gòu)體用法很多,但是坑也很多

    C語(yǔ)言結(jié)構(gòu)體用法很多,坑也很多
    的頭像 發(fā)表于 01-13 16:06 ?1567次閱讀

    C語(yǔ)言中的#和##的用法

    和conStr的參數(shù),并且宏conStr和toString中均含有#或者##符號(hào),所以A不能被解引用。導(dǎo)致不符合預(yù)期的情況出現(xiàn)。 3.2 解決方案 結(jié)果: 責(zé)任編輯:xj 原文標(biāo)題:C語(yǔ)言中#和##的用法 文章出處:【微信公眾號(hào)
    的頭像 發(fā)表于 12-06 09:34 ?7.7w次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>中的#和##的<b class='flag-5'>用法</b>

    C語(yǔ)言C++的特點(diǎn)與用法詳細(xì)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是C語(yǔ)言C++的特點(diǎn)與用法詳細(xì)說(shuō)明。
    的頭像 發(fā)表于 12-26 10:58 ?4737次閱讀

    C語(yǔ)言中的typedef的用法

    在以前的學(xué)習(xí)中對(duì)于C語(yǔ)言中typedef和define的認(rèn)識(shí)是,#define是宏,作用是簡(jiǎn)單的替換,而typedef也是替換,只不過(guò)比define高級(jí)的是在替換的時(shí)候會(huì)進(jìn)行語(yǔ)法檢查。但是后來(lái)
    發(fā)表于 01-13 13:36 ?0次下載
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>中的typedef的<b class='flag-5'>用法</b>

    詳解C語(yǔ)言中特殊用法

    C語(yǔ)言有很多特殊的用法,如果這些特殊用法使用得當(dāng),會(huì)是你的代碼變得更加有健壯,更加容易維護(hù)。
    的頭像 發(fā)表于 07-15 08:57 ?1754次閱讀

    C語(yǔ)言進(jìn)階】C語(yǔ)言指針的高階用法

    C語(yǔ)言進(jìn)階】C語(yǔ)言指針的高階用法
    的頭像 發(fā)表于 08-31 13:24 ?2714次閱讀

    PLC光分路器的分類(lèi)和具體用法

    PLC光分路器的分類(lèi)和具體用法? PLC(Planar Lightwave Circuit,平面光波導(dǎo)電路)光分路器是一種集成光學(xué)器件,用于在光通信、光網(wǎng)絡(luò)、傳感器和光學(xué)測(cè)試等領(lǐng)域中實(shí)現(xiàn)光信號(hào)的分配
    的頭像 發(fā)表于 11-28 15:50 ?1755次閱讀
    主站蜘蛛池模板: 爽死你个放荡粗暴小淫视频 | 亚洲精品老司机综合影院 | 狠狠色视频| 久久精品免视看国产成人2021 | 亚洲www.| 狠狠色婷婷丁香综合久久韩国 | 婷婷综合久久中文字幕蜜桃三 | 色视频久久 | 四虎免费大片aⅴ入口 | 天天天综合 | 三级精品视频在线播放 | 性欧美一区 | 变态重口极致另类在线 | 美女黄网站人色视频免费国产 | 亚洲男女免费视频 | 亚洲高清一区二区三区四区 | 国产精品资源站 | 四虎4hu永久免费国产精品 | 亚洲va中文va欧美va爽爽 | 国产精品丝袜 | 亚洲精品精品一区 | 午夜激情婷婷 | 久久成人综合 | 国产香蕉一区二区精品视频 | 欧美黄色大片免费观看 | 亚洲综合春色另类久久 | 欧美日韩国产一区二区三区不卡 | 天天干天天爱天天射 | 成年看片免费高清观看 | 黄色免费网站视频 | 日韩成人黄色 | 亚洲成a人片在线看 | 免费性网站 | 男男宿舍高h炒肉bl 男男污肉高h坐便器调教 | 天天看黄 | 天天摸天天爽天天澡视频 | 99热最新在线 | 张柏芝三级无删减在线观看 | 四虎hu | 男子扒开美女尿口做羞羞的事 | 女人张开腿让男人做爽爽 |