可变参函数
简介:
采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数的参数个数可以根据需要确定。例如
printf(const char * _Format, ...);
实现:
C语言可变参数通过三个宏(va_start、va_end、va_arg)和一个类型(va_list)实现。
typedef char * va_list; #define va_start _crt_va_start #define va_arg _crt_va_arg #define va_end _crt_va_end #define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) ) //参数:ap为可变参的地址,v为确定的参数 //功能:确定第一个可变参的地址(函数参数从右向左压栈) #define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //参数:ap为可变参的地址,t为可变参的类型 //功能:获取可变参的值 #define _crt_va_end(ap) ( ap = (va_list)0 ) //功能:将ap置空
Demo:
/* va_start example */ #include <stdio.h> /* printf */ #include <stdarg.h> /* va_list, va_start, va_arg, va_end */ void PrintFloats(int n, ...) { int i; double val; printf("Printing floats:"); va_list vl; va_start(vl, n); for (i = 0; i < n; i++) { val = va_arg(vl, double); printf(" [%.2f]", val); } va_end(vl); printf("\n"); } int main() { PrintFloats(3, 3.14159, 2.71828, 1.41421); return 0; }
参考资料:
http://www.cplusplus.com/reference/cstdarg/