C可变参数函数实现
作者:网络转载 发布时间:[ 2012/11/26 10:05:44 ] 推荐标签:
一直以来习惯了使用printf函数,但是对于可变参数没有深入研究过,觉得可变参数是一个神奇的技术。想研究研究看可变参数的使用和原理。目前C提供的可变参数的申明为
void function(const char *format, ...);
这样可以在function中使用可变参数C提供了几个宏用于使用可变参数
va_list
va_start
va_arg
va_end
C函数要在程序中用到以下这些宏:
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
va_list:用来保存宏va_start、va_arg和va_end所需信息的一种类型。为了访问变长参数列表中的参数,必须声明va_list类型的一个对象。
定义:typedef char * va_list;
va_start:访问变长参数列表中的参数之前使用的宏,它初始化用va_list声明的对象,初始化结果供宏va_arg和va_end使用;
va_arg:展开成一个表达式的宏,该表达式具有变长参数列表中下一个参数的值和类型。每次调用va_arg都会修改,用va_list声明的对象,从而使该对象指向参数列表中的下一个参数;
va_end:该宏使程序能够从变长参数列表用宏va_start引用的函数中正常返回。
va在这里是variable-argument(可变参数)的意思。
这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件。
#include <cstdarg>
#include <cstdio>
#include <iostream>
using namespace std;
void Output(char *szFormat, ...)
{
va_list argptr;
char szBuf[1024];
va_start(argptr, szFormat);
vsprintf_s(szBuf,szFormat, argptr);
cout<<szBuf<<endl;
va_end(argptr);
}
//output the args
int ArgsCount(char *szFormat, ...)
{
va_list argptr;
int argNomber = 0;
char *szBuf;
va_start(argptr,szFormat);
while (1)
{
szBuf = va_arg(argptr,char*);
if(strcmp(szBuf,"0") == 0)
break;
cout<<"the parameter #"<<argNomber<<" is "<<szBuf<<endl;
argNomber++;
}
va_end(argptr);
return argNomber;
}
int main()
{
char czA[] = "wql";
char czB[] = "hello";
Output("Who are you? i am %s, %s",czA,czB);
ArgsCount("Hello", "Who","are","you","i am","wql", "0");
return 0;
}
1)首先在函数里定义一个va_list型的变量,这里是arg_ptr,这个变 量是指向参数的指针。
2)然后用va_start宏初始化变量arg_ptr,这个宏的第二个参数是第 一个可变参数的前一个参数,是一个固定的参数。
3)然后用va_arg返回可变的参数,并赋值给整数j.va_arg的第二个参数是你要返回的参数的类型,这里是int型。
4)后用va_end宏结束可变参数的获取,然后你可以在函数里使用第二个参数了。如果函数有多个可变参数的,依次调用va_arg获 取各个参数。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11