#include <stdio.h>
#include <stdarg.h>
void log(int level, char *fmt, ...) {
printf("[%d] ", level);
va_list ap = NULL;
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
}
// debug
void d( char *fmt, ...) {
va_list ap = NULL;
va_start(ap, fmt);
log(0, fmt, ap);
va_end(ap);
}
// info
void i(char *fmt, ...) {
va_list ap = NULL;
va_start(ap, fmt);
log(1, fmt, ap);
va_end(ap);
}
// warn
void w(char *fmt, ...) {
va_list ap = NULL;
va_start(ap, fmt);
log(2, fmt, ap);
va_end(ap);
}
// error
void e(char *fmt, ...) {
va_list ap = NULL;
va_start(ap, fmt);
log(3, fmt, ap);
va_end(ap);
}
在上面代码中,log函数定义形式不能正确接收其他函数传递过来的可变参数列表,正确的log函数写法如下,其他函数不变
void log(int level, char *fmt, va_list ap) {
printf("[%d] ", level);
vprintf(fmt, ap);
printf("\n");
}
代码中va_start宏的作用是计算出形参fmt后面那个形参的地址,并赋值给ap;