// 定义 char * 指针类型
#define va_list char *
va_list ap;
char *ap;
// 指向可变参数的第一个
#define va_start(ap, last_arg) (ap = (va_list)&last_arg + sizeof(last_arg))
va_start(ap, n);
ap = (char *)&n + sizeof(n);
// ap 自增 sizeof(t),然后减去 sizeof(t),顺序获取参数的值
// ap 首先增加了 sizeof(t),然后又减去了 sizeof(t)。主要是为了在一个宏中能让 ap 向上增长,同时又可以获取当前参数的值。
#define va_arg(ap, t) (*(t *)((ap = (ap + sizeof(t))) - sizeof(t)))
int value = va_arg(ap, int);
// 取值
int value = *(int *)ap;
// 自增
ap += sizeof(t);
// 指针清零
#define va_end(ap) (ap = ((va_list)0))
va_end(ap);
ap = (char *)0;