Linux C 进阶 —— 可变参数

rtthread / 2023-09-06 / 原文

 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 }