// 多参数函数设计1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
double add(char *str,...)
{
va_list marker; //定义该参数指向参数的指针
double result = 0.0; //marker列表的当前值变量
va_start(marker, str);//初始化va_list变量,marker指向堆栈的地址
while(*str)
{
if(*str == '%')
{
switch(*(++str))
{
//判断str的值,然后返回marker列表的当前值,并指向列表的下一个位置
case 'd':result += va_arg(marker, int);//返回可变参数
break;//be careful!
case 'f':result += va_arg(marker, double);
break;
}
}
str++;
}
va_end(marker);//定义marker = ((viod*)0),是marker不再指向堆栈
return result;
}
int _tmain(int argc, _TCHAR* argv[])
{
double result;
result = add("%d%d%f",6,2,4.8);
printf("result = %f\n",result);
system("pause");
return 0;
//
#include "stdafx.h"
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
double add(char *str,...)
{
va_list marker; //定义该参数指向参数的指针
double result = 0.0; //marker列表的当前值变量
va_start(marker, str);//初始化va_list变量,marker指向堆栈的地址
while(*str)
{
if(*str == '%')
{
switch(*(++str))
{
//判断str的值,然后返回marker列表的当前值,并指向列表的下一个位置
case 'd':result += va_arg(marker, int);//返回可变参数
break;//be careful!
case 'f':result += va_arg(marker, double);
break;
}
}
str++;
}
va_end(marker);//定义marker = ((viod*)0),是marker不再指向堆栈
return result;
}
int _tmain(int argc, _TCHAR* argv[])
{
double result;
result = add("%d%d%f",6,2,4.8);
printf("result = %f\n",result);
system("pause");
return 0;
}
要点:
1、va_list()是C语言中解决可变参数的一组宏。
2、首先定义va_list类型变量,该变量是指向参数的指针。
3、然后用va_start()宏初始化ca_list变量,如va_start(marker, str),这里有两个变量,一个是类型变量marker,另一个用str来指定位置。
4、va_arg()返回可变参数,如add()中返回了输入的具体数值。 va_arg(marker, int)这个返回了输入的具体数值,这里两个参数(类型变量,返回值类型)。
5、va_end()结束可变参数的获取。多个参数,会依次调用 va_arg(marker, int)宏来获取各个参数。