日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++ ## ... 实用

發(fā)布時(shí)間:2024/9/21 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ ## ... 实用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

...在C宏中稱為Variadic Macro,也就是變參宏。比如:

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


// 或者


#define myprintf(templt,args...) fprintf(stderr,templt,args)

第一個(gè)宏中由于沒(méi)有對(duì)變參起名,我們用默認(rèn)的宏__VA_ARGS__來(lái)替代它。第二個(gè)宏中,我們顯式地命名變參為args,那么我們?cè)诤甓x中就可以用args來(lái)代指變參了。同C語(yǔ)言的stdcall一樣,變參必須作為參數(shù)表的最有一項(xiàng)出現(xiàn)。當(dāng)上面的宏中我們只能提供第一個(gè)參數(shù)templt時(shí),C標(biāo)準(zhǔn)要求我們必須寫(xiě)成:

myprintf(templt,);

的 形式。這時(shí)的替換過(guò)程為:

myprintf("Error!\n",);


替換為:



fprintf(stderr,"Error!\n",);

這是一個(gè)語(yǔ)法錯(cuò)誤,不能正常編譯。這個(gè)問(wèn)題一般有 兩個(gè)解決方法。首先,GNU CPP提供的解決方法允許上面的宏調(diào)用寫(xiě)成:

myprintf(templt);

而它將會(huì) 被通過(guò)替換變成:

fprintf(stderr,"Error!\n",);

很明顯,這里仍然會(huì)產(chǎn)生編譯錯(cuò)誤(非本例的 某些情況下不會(huì)產(chǎn)生編譯錯(cuò)誤)。除了這種方式外,c99和GNUCPP都支持下面的宏定義方式:

#define myprintf(templt, ...) fprintf(stderr,templt,##__VAR_ARGS__)

這 時(shí),##這個(gè)連接符號(hào)充當(dāng)?shù)淖饔镁褪钱?dāng)__VAR_ARGS__為空的時(shí)候,消除前面的那個(gè)逗號(hào)。那么此時(shí)的翻譯過(guò)程如下:

myprintf(templt);


被轉(zhuǎn)化為:


fprintf(stderr,templt);

這樣如果templt合法,將不會(huì)產(chǎn)生 編譯錯(cuò)誤。 這里列出了一些宏使用中容易出錯(cuò)的地方,以及合適的使用方式。

總結(jié)

以上是生活随笔為你收集整理的C++ ## ... 实用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。