#defineFOO(arg)my##arg則>FOO(abc)相當(dāng)于myabc#是“字符串化”">
宏定義中##和#的作用

宏定義中##和#的作用

ID:39135159

大?。?2.51 KB

頁(yè)數(shù):3頁(yè)

時(shí)間:2019-06-25

宏定義中##和#的作用_第1頁(yè)
宏定義中##和#的作用_第2頁(yè)
宏定義中##和#的作用_第3頁(yè)
資源描述:

《宏定義中##和#的作用》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)

1、內(nèi)核中有很多的宏定義,在宏定義define中經(jīng)??吹絻蓚€(gè)字符串##和#,這里把它的用法做一下說(shuō)明:##是一個(gè)連接符號(hào),用于把參數(shù)連在一起例如:>#defineFOO(arg)my##arg則>FOO(abc)相當(dāng)于myabc#是“字符串化”的意思。出現(xiàn)在宏定義中的#是把跟在后面的參數(shù)轉(zhuǎn)換成一個(gè)字符串例如:>#defineSTRCPY(dst,src)strcpy(dst,#src)則>STRCPY(buff,abc)相當(dāng)于strcpy(buff,"abc")另外,如果##后的參數(shù)本身也是一個(gè)宏的話,##會(huì)阻止這個(gè)宏的展開。#defineSTRCPY(a,b)strcpy(a##_p

2、,#b)intmain(){charvar1_p[20];charvar2_p[30];strcpy(var1_p,"aaaa");strcpy(var2_p,"bbbb");STRCPY(var1,var2);STRCPY(var2,var1);printf("var1=%s",var1_p);printf("var2=%s",var2_p);return0;/*注意這里*/STRCPY(STRCPY(var1,var2),var2);/*這里是否會(huì)展開為:strcpy(strcpy(var1_p,"var2")_p,"var2“)?*答案是否定的:*展開結(jié)果將是:str

3、cpy(STRCPY(var1,var2)_p,"var2")*##阻止了參數(shù)的宏展開!*如果宏定義里沒(méi)有用到#和##,宏將會(huì)完全展開*/}/////////////////////////////////////////////////////////////////////////tellyouabout##incommontext關(guān)于記號(hào)粘貼操作符(tokenpasteoperator):##1.簡(jiǎn)單的說(shuō),“##”是一種分隔連接方式,它的作用是先分隔,然后進(jìn)行強(qiáng)制連接。其中,分隔的作用類似于空格。我們知道在普通的宏定義中,預(yù)處理器一般把空格解釋成分段標(biāo)志,對(duì)于每一段和前面比較

4、,相同的就被替換。但是這樣做的結(jié)果是,被替換段之間存在一些空格。如果我們不希望出現(xiàn)這些空格,就可以通過(guò)添加一些##來(lái)替代空格。另外一些分隔標(biāo)志是,包括操作符,比如+,-,*,/,[,],...,所以盡管下面的宏定義沒(méi)有空格,但是依然表達(dá)有意義的定義:defineadd(a,b)a+b而其強(qiáng)制連接的作用是,去掉和前面的字符串之間的空格,而把兩者連接起來(lái)。2.舉列--試比較下述幾個(gè)宏定義的區(qū)別#defineA1(name,type)typename_##type##_type或#defineA2(name,type)typename##_##type##_typeA1(a1,int);

5、/*等價(jià)于:intname_int_type;*/A2(a1,int);/*等價(jià)于:inta1_int_type;*/解釋:1)在第一個(gè)宏定義中,"name"和第一個(gè)"_"之間,以及第2個(gè)"_"和第二個(gè)"type"之間沒(méi)有被分隔,所以預(yù)處理器會(huì)把name_##type##_type解釋成3段:“name_”、“type”、以及“_type”,這中間只有“type”是在宏前面出現(xiàn)過(guò)的,所以它可以被宏替換。2)而在第二個(gè)宏定義中,“name”和第一個(gè)“_”之間也被分隔了,所以預(yù)處理器會(huì)把name##_##type##_type解釋成4段:“name”、“_”、“type”以及“_typ

6、e”,這其間,就有兩個(gè)可以被宏替換了。3)A1和A2的定義也可以如下:#defineA1(name,type)typename_##type##_type<##前面隨意加上一些空格>#defineA2(name,type)typename##_##type##_type結(jié)果是##會(huì)把前面的空格去掉完成強(qiáng)連接,得到和上面結(jié)果相同的宏定義3.其他相關(guān)--單獨(dú)的一個(gè)#至于單獨(dú)一個(gè)#,則表示對(duì)這個(gè)變量替換后,再加雙引號(hào)引起來(lái)。比如#define__stringify_1(x)#x那么__stringify_1(linux)<==>"linux"所以,對(duì)于MODULE_DEVICE_TABL

7、E1)#defineMODULE_DEVICE_TABLE(type,name)MODULE_GENERIC_TABLE(type##_device,name)2)#defineMODULE_GENERIC_TABLE(gtype,name)externconststructgtype##_id__mod_##gtype##_table__attribute__((unused,alias(__stringify(name))))得到MODULE_DEVICE_TAB

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。