可变参数函数的实现

  对于可变参数函数获取其可变的参数,我们可以用下列宏来得到:

  #include

  void va_start(va_list ap, last);

  type va_arg(va_list ap, type);

  void va_end(va_list ap);

  void va_copy(va_list dest, va_list src);

  在没有深入理解实现原理的情况下,这些宏应该如何的使用总是很难记忆,因此有必要搞清楚可变参数函数实现基本原理。

  void variable_argument_func(int arg1, int arg2, ...)

  {

  //我们应该怎样获取,这些可变的参数呢?

  //首先我们要了解,他们是紧挨着arg0和arg1保存在调用函数堆栈上的。

  //由低到高为 arg1-arg2-可变参数1-可变参数2-...-可变参数n

  //我们假定编译器是连续存储这些变量的,并且没有任何对齐的限制。

  //如果想获得每一个可变参数,我们需要知道他们的首地址,已经每一个变量的类型

  int va1;

  int va2;

  int va3;

  void *va_p = &arg2 + 1; //通过最后一个固定变量,获得可变参数首地址

  va1 = *((int *)va_p); //依次获得每一个变量

  va_p += sizeof(int);

  va2 = *((int *)va_p);

  va_p += sizeof(int);

  va3 = *((int *)va_p);

  }

  可能注意到,我们上面用的全部是int类型的变量,因为这样能符合我先前的一个假设:所有参数是连续存储的,如果参数含有其他非4字节对齐的变量,类似上面的做法会出错误,这些特性依赖与编译器,所以我们应使用stdarg.h中的宏,我们实验的目的仅仅在于了解大概的实现原理。

posted @ 2011-03-30 13:47  狼哥2  阅读(147)  评论(0编辑  收藏  举报