1 #include <stdio.h> 2 #include <stdarg.h> 3 /* 方式1 C99宏方式 GNU C扩展 宏方式 */ 4 #define MC_C99_PRINT(fmt,...) printf(fmt, ##__VA_ARGS__) //## 作用:当变参列表为空时,消除 fmt 后的逗号 5 #define MC_GNC_PRINT(fmt,args...) printf(fmt, ##args) 6 /* 方式2 可变参数函数方式 */ 7 void PRINT(int tag, ...) 8 { 9 char *pc = NULL; 10 int i = 0; 11 va_list args; 12 char *fmt = NULL; 13 14 va_start(args, tag); 15 if (tag == 1) 16 { 17 i = va_arg(args, int); 18 printf("i=%d\n", i); 19 } 20 else if(tag == 2) 21 { 22 pc = va_arg(args, char*); 23 printf("%s\n", pc); 24 } 25 else 26 { 27 fmt = va_arg(args, char*); 28 vprintf(fmt, args); 29 } 30 va_end(args); 31 return; 32 } 33 34 __attribute__((format(printf, 2, 3))) void DEBUG(char* tag, char* fmt, ...); 35 void DEBUG(char* tag, char* fmt, ...) 36 { 37 va_list ap; 38 39 va_start(ap, fmt); 40 printf("%s", tag); 41 vprintf(fmt, ap); 42 va_end(ap); 43 } 44 45 int main() 46 { 47 PRINT(1, 12); 48 PRINT(2, "Hello"); 49 PRINT(3, "HF %d\n", 33); 50 PRINT(4, "China\n"); 51 52 DEBUG("[TRACE] ", "%s\n", "world"); 53 54 MC_C99_PRINT("C99_MAC\n"); 55 MC_GNC_PRINT("GNC %s\n", "extern"); 56 57 return 0; 58 }
标签:va,进阶,Linux,fmt,args,char,tag,可变,PRINT From: https://www.cnblogs.com/rtthread/p/17681481.html