可变参数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语言中堆栈是一个非常重要的部分,理解了堆栈的组成才能了解程序的调用过程,这部分简单的介绍函数调用过程中的堆栈形式。基本模型如下所示:
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语言中堆栈是一个非常重要的部分,理解了堆栈的组成才能了解程序的调用过程,这部分简单的介绍函数调用过程中的堆栈形式。基本模型如下所示:
相关文章推荐
- 理解可变参数va_list、va_start、va_arg、va_end原理及使用方法
- 理解可变参数va_list、va_start、va_arg、va_end原理及使用方法
- 【转载】理解可变参数va_list、va_start、va_arg、va_end原理及使用方法
- 理解可变参数va_list、va_start、va_arg、va_end原理及使用方法
- 理解可变参数va_list、va_start、va_arg、va_end原理及使用方法
- 理解可变参数va_list、va_start、va_arg、va_end原理及使用方法
- 理解可变参数va_list、va_start、va_arg、va_end原理及使用方法
- C++可变长参数va_list的使用
- 函数可变参数va_list、va_start、va_arg、va_end原理及使用方法
- C,C++中使用可变参数[va_list、va_start(),va_end()和va_arg()]
- va_list(可变参数函数的使用)
- va_list可变参数简单使用test
- C/C++中va_list,va_start,va_arg,va_end等可变参数宏的使用
- iOS 使用可变参数va_list, 定义一个方法
- va_list,可变参数的使用
- C++可变参数列表处理宏va_list、va_start、va_end的使用
- iOS va_list可变参数使用
- C++可变参数列表处理宏va_list、va_start、va_end的使用
- c语言 可变参数传递 va_list使用
- vsprintf,va_list可变参数的使用