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 }