background image

        p++;

      }

}

 

编译运行的结果为

  0056 0000 0066 0000 | 0001 0000 0000 0000 | 0098 0000 0000 0000 | 0055 0000 0000 0000

 

由运行结果可见,通过这样方式可以逐一获得可变参数的值。

至于为什么通常被声明为 char*类型,我们慢慢看来。

2,怎样确定参数类型和数量

通过上述的方式,我们首先解决了取得可变参数值的问题,但是对于一个参数,值很重
要,其类型同样举足轻重,而对于一个函数来讲参数个数也非常重要,否则就会产生了
一系列的麻烦来。通过访问存储参数的栈空间,我们并不能得到关于类型的任何信息和参

——

数个数的任何信息。我想你应该想到了

使用 char *参数。Printf 函数就是这样实现的,

它把后面的可变参数类型都放到了 char *指向的字符数组里,并通过%来标识以便与其它
的字符相区别,从而确定了参数类型也确定了参数个数。其实,用何种方式来到达这样的
效果取决于函数的实现。比如说,定义一个函数,预知它的可变参数类型都是 int,那么
固定参数完全可以用 int 类型来替换 char*类型,因为只要得到参数个数就可以了。

3,言归正传

   我想到了这里,大概的轮廓已经呈现出来了。本来想就此作罢的(我的惰性使然),但
是一想到如果不具实用性便可能是一堆废物,枉费我打了这么些字,决定还是继续下去。

   我是比较抵制用那些不明所以的宏定义的,所以在上面的阐述里一点都没有涉及定义
在<stdarg.h>的 va(variable-argument)宏。事实上,当时让我产生极大疑惑和好奇的正是这几
个宏定义。但是现在我们不得不要去和这些宏定义打打交道,毕竟我们在讨生计的时候还

得用上他们,这也是我曰之为 言归正传 的理由。

   好了,我们来看一下那些宏定义。

   打开<stdarg.h>文件,找一下 va_*的宏定义,发现不单单只有一组,但是在各组定义前
都会有宏编译。宏编译指示的是不同硬件平台和编译器下用怎样的 va 宏定义。比较一下,