va_list原理及使用方法 发表于 2016-08-21 | 分类于 scatter 简介 VA_LIST 是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活. va_list使用方法 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> void pInt(int a){ printf("%d", a); } void pFoat(double a){ printf("%f", a); } /* 取最大值 */ int get_max(int n_values,...){ va_list var_arg; int count = 0; int max = 0; va_start(var_arg, n_values); int i = 0; for(i = 0; i<n_values; i++){ int cur = va_arg(var_arg, int); if(cur > max) max = cur; } va_end(var_arg); return max; } void listPrint(int n, ...){ va_list args; int i = 0; va_start(args, n); for(; i < n; i++){ printf("%d ", va_arg(args, int)); } va_end(args); return; } void printFmt(const char* fmt, ...){ va_list var_arg; va_start(var_arg, fmt); const char *p = NULL; const char *q = NULL; const char *temp = NULL; for(p = fmt; p < &fmt[strlen(fmt)]; p++){ if(*p == '%') { switch(*++p) { case 'c': putchar(va_arg(var_arg, char)); break; case 's': for(temp = va_arg(var_arg, char *), q = temp; q < temp + strlen(temp); q++){ putchar(*q); } break; case 'd': pInt(va_arg(var_arg, int)); break; case 'f': pFoat(va_arg(var_arg, double)); break; } } if(*p == ' ') putchar(' '); } va_end(var_arg); } int main(int argc, char *argv[]){ int nums = 3, b = 3, c = 5, d = -1; int res = get_max(nums, b, c, d); printf("%d\n", res); return 0; }