C语言中不定参数函数的使用
由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦。C语言中实现不定参数函数的问题是利用调用函数时使用的堆栈来解决。原理是通过堆栈读取可选参数的值,直到读取到所设定的结束标志为止。 下面程序的可选参数的结束标志设置为可选参数参数小于0。
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //第一个可选参数地址
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //返回ap地址处的值,同时ap指向下一个可选参数的地址
#define va_end(ap) ( ap = (va_list)0 ) // 将 指针置为无效
#include "stdafx.h" #include "stdarg.h" void test(int i,int j, ...) { int data; va_list args; //定义va_list变量 printf("%d %d", i, j); va_start(args,j); //使args指向j后的第一个可选参数 while((data = va_arg(args,int)) >= 0) //va_arg函数返回参数args指针所对应的变量值,同时args指向下个可选参// 数. 参数大于或者等于0时,读取数据,同时把读取的数据打印出来。当读 //到小于0的参数时,结束循环。 printf(" %d", data); printf("\n"); va_end(args); //使args指针无效 } int main(int argc, char* argv[]) { test(0, 1 , 3, -1); return 0; }
//程序输出结果为0 1 3
/* main调用test函数堆栈的分布如下图: 地址: 高 ............... | ............... | 第二个可选的参数 | 第一个可选的参数 | j | i 低 test的返回地址 */