
[歷史歸檔]本文原發布于 cstriker1407.info 個人博客內容為歷史存檔僅供參考。發布時間2015-01-22 標題宏返回值和可變參數宏分類編程 / C C 標簽CC·宏宏返回值和可變參數宏宏返回值可變參數宏自己寫的小測試宏返回值以下內容轉自【 http://blog.csdn.net/fjb2080/article/details/5174171 】有刪改。在使用逗號表達式中有一點需要注意的是在逗號表達式中不可以聲明變量。例如intn(inta5,a);//這是錯誤的可以這樣使用:intaintn(a5,a);那么n的值就是6另外在gcc中亦可用{}表達式作為返回值如#definefucn1(a)({aa5;a;})例如下面一個例子#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對于宏返回值的描述【 http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html 】可變參數宏以下內容轉自【www.cnblogs.com/caosiyang/archive/2012/08/21/2648870.html 】有刪改。C99中規定宏可以像函數一樣帶有可變參數比如#defineLOG(format,...)fprintf(stdout,format,__VA_ARGS__)其中…表示參數可變__VA_ARGS__在預處理中為實際的參數集所替換GCC中同時支持如下的形式#defineLOG(format,args...)fprintf(stdout,format,args)其用法和上面的基本一致只是參數符號有變化有一點需要注意上述的宏定義不能省略可變參數盡管你可以傳遞一個空參數這里有必要提到##連接符號的用法。##的作用是對token進行連接在上例中format、__VA_ARGS__、args即是token如果token為空那么不進行連接所以允許省略可變參數(__VA_ARGS__和args)對上述變參宏做如下修改#defineLOG(format,...)fprintf(stdout,format,##__VA_ARGS__)#defineLOG(format,args...)fprintf(stdout,format,##args)自己寫的小測試#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)/*重命名可變參數*/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和上面的值是不同的。 *//*無可變參數無法編譯通過。*/// 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