色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言-#和##的具體用法

嵌入式那些事 ? 來源:嵌入式那些事 ? 2023-12-19 12:54 ? 次閱讀

C語言中,在宏里面使用’#’和’##’有它非常神奇的作用。在宏定義的替換的過程中,#號可以作為一個預處理運算符,把宏參數轉換為字符串。##運算符則可以把兩個宏參數組合在一起。下面就來說說具體的用法。

1、一般用法

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

下面的代碼是演示代碼:

#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;
}

運行結果如下圖:

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

2016-03-21_171313

2、當宏參數是另一個宏的時候

需要注意的是:凡是宏定義里有用'#'或'##'的地方,宏參數是不會再展開。

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

#include

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

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

return0;
}

上面代碼中打印那行的宏會被展開為:

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

(2)、當有'#'或'##'的時候

#include
#include

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

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

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

return0;
}

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

#include
#include

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

intmain(void)
{
//INT_MAX,int型的最大值,為一個變量
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) 然后再轉換成字符串。

第二個輸出代碼:

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

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

3、'#'和'##'的一些應用特例

(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);最終展開為:static int _anonymous9; // 9表示該行行號;,下面分析下具體的展開過程:

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

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

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

對于宏的展開過程,每次只能解開當前層的宏,所以__LINE__在第二層才能被解開。

(2)、獲取文件名

#include

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

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

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

return0;
}

當然了,上述的宏也可以獲取__DATE__,__LINE__等宏實際對應的值,上面專門定義了一個數組來存儲轉換后的值,實際使用時是否定義數組可自行安排。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140489
  • 字符串
    +關注

    關注

    1

    文章

    589

    瀏覽量

    21128
  • 代碼
    +關注

    關注

    30

    文章

    4889

    瀏覽量

    70282
  • 運算符
    +關注

    關注

    0

    文章

    172

    瀏覽量

    11353

原文標題:C語言-#和##的神奇作用

文章出處:【微信號:嵌入式那些事,微信公眾號:嵌入式那些事】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏

    評論

    相關推薦
    熱點推薦

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

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

    plsy指令具體用法

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

    誰知道BAV99的具體功能和用法

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

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

    請教一哈大俠們:能不能舉一下具體的例子來說明兩個的具體用法呀!!兩個的圖標分別如下:先謝謝哈!!
    發(fā)表于 01-03 19:45

    求教這個軟鍵盤的具體用法

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

    C語言的位操作在STM32f1單片機編程的具體應用 精選資料推薦

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

    STM32CUBEMX具體詳細的用法

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

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

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

    C語言結構體用法很多,但是坑也很多

    C語言結構體用法很多,坑也很多
    的頭像 發(fā)表于 01-13 16:06 ?1564次閱讀

    C語言中的#和##的用法

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

    C語言C++的特點與用法詳細說明

    本文檔的主要內容詳細介紹的是C語言C++的特點與用法詳細說明。
    的頭像 發(fā)表于 12-26 10:58 ?4730次閱讀

    C語言中的typedef的用法

    在以前的學習中對于C語言中typedef和define的認識是,#define是宏,作用是簡單的替換,而typedef也是替換,只不過比define高級的是在替換的時候會進行語法檢查。但是后來
    發(fā)表于 01-13 13:36 ?0次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中的typedef的<b class='flag-5'>用法</b>

    詳解C語言中特殊用法

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

    C語言進階】C語言指針的高階用法

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

    PLC光分路器的分類和具體用法

    PLC光分路器的分類和具體用法? PLC(Planar Lightwave Circuit,平面光波導電路)光分路器是一種集成光學器件,用于在光通信、光網絡、傳感器和光學測試等領域中實現光信號的分配
    的頭像 發(fā)表于 11-28 15:50 ?1734次閱讀
    主站蜘蛛池模板: 两个人的视频hd全免费 | 成人AV精品视频 | 国产小视频在线高清播放 | 亚洲AV午夜福利精品香蕉麻豆 | 日本片bbbxxx | 成人性生交大片免费看金瓶七仙女 | 亚洲精品无码不卡在线播放he | BL文库好大粗黑强强肉NP | 精品国产福利在线视频 | 无限资源在线观看8 | 国产精品国产三级国产专区53 | 内射后入在线观看一区 | 中国大陆一级毛片免费 | 99久久香蕉国产线看观看 | 欧美亚洲日韩在线在线影院 | 少妇性饥渴BBBBBBBBB | 人人干人人插 | 人妻仑乱少妇88MAV | 偷拍自偷拍亚洲精品 | 蜜芽一区二区国产精品 | 含羞草完整视频在线播放免费 | bbwvideoa欧美老妇 | ppypp午夜限制不卡影院私人 | 热re99久久精品国99热 | 久久这里只有精品视频e | 中文字幕精品视频在线 | 老司机福利在 线影院 | 黑吊大战白xxxxxx | qvod在线| 牢记永久免费网址 | 白丝高中生被c爽哭 | 纯肉高H种马艳遇风流多 | 黄色三级在线观看 | 国产精品久久久久久亚洲影视 | 6080YYY午夜理论片在线观看 | 丰满的女友1在线观看 | 国产精品无码中文在线AV | 在线观看国产精选免费 | 亚洲 自拍 偷拍 另类综合图区 | 中文字幕人成人乱码亚洲AV | 国产成人精品区在线观看 |

    電子發(fā)燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品