您的位置:首页 > 其它

可变参数va_list的理解和使用

2017-08-06 18:13 295 查看
在编写C语言代码的过程中经常会使用printf实现打印的格式化,该函数支持多样化的参数,同时还支持不定个数的参数,即可变参数。有关可变参数都知道是采用了va_list实现。通常是采用如下的形式:

va_list vp;

va_start(vp, arg1);

typevalue1 = va_arg(vp, typename1);

...

typevalueN = va_arg(vp, typenameN);

va_end(vp);

以上是可变参数的使用方法,其中定义可变参数的函数必须有至少一个确定的参数。比如函数printf的声明如下所示:

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

其中format是必须的参数,否则该函数将编译出错。

从上述的代码格式中可知,可以通过多次调用va_arg()获取对应的参数值,该值的获取还需要知道对应的值类型。多次调用该接口还需要有关可变参数的个数,这些信息都要通过某种形式传递到。因此使用va_list必须要知道参数的个数以及对应参数的类型等。

在通常接触到的可变参数接口printf时实际上传递了这些参数,因为调用printf()函数时通常会设定一系列的格式,而这些格式实际上就指出了当前可变参数的个数,以及对应的参数类型,这些都是通过在format中指定的,这样printf通过format中格式化的符号就能确定类型,同时转义字符的个数也就确定了可变参数的个数。如下所示:

printf("%d,%d,%d,%d\n", a, b , c, d);通过%d的数量可知,可变参数的个数为4个,%d表示整数,因此需要的类型也就对应于int。

这里简单的介绍一下va_list的实现方法:

在C语言中堆栈是一个非常重要的部分,理解了堆栈的组成才能了解程序的调用过程,这部分简单的介绍函数调用过程中的堆栈形式。基本模型如下所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: