一 定义
- variadic函数,即可变参数函数,是例如printf这样需要可变数量参数的函数。函数声明使用…作为最后一个参数,且至少之前有一个命名参数(自C89,K&R C 不支持)。
二 访问
- 在函数体中访问可变参数需要stdarg.h中的工具,具体如下:
- va_start:允许访问可变参数函数参数(函数宏)
- va_arg:访问下一个可变参数函数参数(函数宏)
- va_copy(C99):制作可变参数函数参数(函数宏)的副本
- va_end: 结束可变参数函数参数(函数宏)的遍历
- va_list:保存va_start,va_arg,va_end和va_copy(typedef)所需的信息
三 使用
-
使用vprintf打印到控制台
使用参数列表发送格式化输出到标准输出 stdout
int vprintf(const char *format, va_list arg)void print(const char* format, ...) { va_list ap; va_start(ap, format); vprintf(format, ap); va_end(ap); }
-
使用vfprintf打印到文件
使用参数列表发送格式化输出到流 stream 中
int vfprintf(FILE *stream, const char *format, va_list arg)void print_file(const char* format, ...) { va_list ap; va_start(ap, format); FILE* fp; fp = fopen("./file.txt", "w"); if (fp) vfprintf(fp, format, ap); va_end(ap); if (fp) fclose(fp); }
-
va_copy和va_arg的使用
void print_int(int count, ...) { va_list ap; va_list ap1; va_start(ap, count); va_copy(ap1, ap); int i = 0; while (i < count) { printf("%d", va_arg(ap, int)); ++i; } va_end(ap); i = 0; while (i < count) { printf("%d", va_arg(ap, int)); ++i; } }