可变函数参数

来源:互联网 发布:虚拟机网络桥接模式 编辑:程序博客网 时间:2024/06/01 09:03

        C语言中一般的函数参数都是固定的,包括参数数量和参数类型,但有时参数的数量在执行期前无法确定,该怎么办呢?C语言提供了可变参数的语法,大家最熟悉和常用的函数printf()就是可变参数函数:

 int printf( const char* format, ...);

在实现时,需要用到三个宏:va_start(), va_arg()和va_end(),其定义如下:

  typedef char * va_list;   #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)) )   #define va_end(ap) ( ap = (va_list)0 )

利用这些宏,就可以实现可变参数函数了:

void print(int x, ...) {   va_list arg;   int y=0;     va_start(arg_ptr, x);   y=va_arg(arg, int);   va_end(arg);   printf("%d %d\n", x, y); }



实现可变参数的关键在于,调用函数时,函数参数依次入栈,在栈中是相邻的(但未必连续)。


0 0