宏)
[歷史歸檔]本文原發(fā)布于 cstriker1407.info 個(gè)人博客內(nèi)容為歷史存檔僅供參考。發(fā)布時(shí)間2015-01-22 標(biāo)題宏返回值和可變參數(shù)宏分類編程 / C C 標(biāo)簽CC·宏宏返回值和可變參數(shù)宏宏返回值可變參數(shù)宏自己寫(xiě)的小測(cè)試宏返回值以下內(nèi)容轉(zhuǎn)自【 http://blog.csdn.net/fjb2080/article/details/5174171 】有刪改。在使用逗號(hào)表達(dá)式中有一點(diǎn)需要注意的是在逗號(hào)表達(dá)式中不可以聲明變量。例如intn(inta5,a);//這是錯(cuò)誤的可以這樣使用:intaintn(a5,a);那么n的值就是6另外在gcc中亦可用{}表達(dá)式作為返回值如#definefucn1(a)({aa5;a;})例如下面一個(gè)例子#includestdio.h#definefunc(a)({aa5;a;})intmain(void){//int i;//int a (i5, i);inta0;intbfunc(a);printf(a%d/n,a);printf(b%d/n,b);return0;}輸出a5b5GCC對(duì)于宏返回值的描述【 http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html 】可變參數(shù)宏以下內(nèi)容轉(zhuǎn)自【www.cnblogs.com/caosiyang/archive/2012/08/21/2648870.html 】有刪改。C99中規(guī)定宏可以像函數(shù)一樣帶有可變參數(shù)比如#defineLOG(format,...)fprintf(stdout,format,__VA_ARGS__)其中…表示參數(shù)可變__VA_ARGS__在預(yù)處理中為實(shí)際的參數(shù)集所替換GCC中同時(shí)支持如下的形式#defineLOG(format,args...)fprintf(stdout,format,args)其用法和上面的基本一致只是參數(shù)符號(hào)有變化有一點(diǎn)需要注意上述的宏定義不能省略可變參數(shù)盡管你可以傳遞一個(gè)空參數(shù)這里有必要提到##連接符號(hào)的用法。##的作用是對(duì)token進(jìn)行連接在上例中format、__VA_ARGS__、args即是token如果token為空那么不進(jìn)行連接所以允許省略可變參數(shù)(__VA_ARGS__和args)對(duì)上述變參宏做如下修改#defineLOG(format,...)fprintf(stdout,format,##__VA_ARGS__)#defineLOG(format,args...)fprintf(stdout,format,##args)自己寫(xiě)的小測(cè)試#includestdio.hintcalcnum(inta,intb){aab10;bb5;returnb;}#defineCALCNUM(a,b)\({\aab10;\bb5;\b;\})#defineLOGA(format,...)printf(format,__VA_ARGS__)#defineLOGB(format,...)printf(format,##__VA_ARGS__)#defineLOGC(format,xx...)printf(format,##xx)/*重命名可變參數(shù)*/intmain(void){inta3,b5;intresultcalcnum(a,b);printf(result:%d a:%d b:%d ,result,a,b);a3,b5;resultCALCNUM(a,b);printf(result:%d a:%d b:%d ,result,a,b);/* 注意這里的ab和上面的值是不同的。 *//*無(wú)可變參數(shù)無(wú)法編譯通過(guò)。*/// LOGA(Hello World A);LOGB(Hello World B );LOGC(Hello World C );LOGA(Hello World A%s,OMG);LOGB(Hello World B%s,OMG);LOGC(Hello World C%s,OMG);return0;}輸出result:10a:3b:5result:10a:18b:10Hello World B Hello World C Hello World A OMG Hello World B OMG Hello World C OMG