C++ ## ... 实用
關(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)要求我們必須寫成:
myprintf(templt,);
的 形式。這時(shí)的替換過(guò)程為:
myprintf("Error!\n",);
替換為:
fprintf(stderr,"Error!\n",);
這是一個(gè)語(yǔ)法錯(cuò)誤,不能正常編譯。這個(gè)問(wèn)題一般有 兩個(gè)解決方法。首先,GNU CPP提供的解決方法允許上面的宏調(diào)用寫成:
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)題。
- 上一篇: Linux按照CPU、内存、磁盘IO、网
- 下一篇: ASP.NET Core的路由[1]:注