详解可变参数列表

      首先要应用可变参数列表需要加头文件#include<stdarg.h>,可变参数列表是通过宏来实现的,这些宏定义在头文件中。

现在模拟实现printf函数

void print(const char *format,...)    //至少含有一个参数
{
	va_list arg;  //va_list是char*的重命名
	va_start(arg,format);
    while(*format)
	{
		switch(*format)
		{
		case'c':
		     {
			 char tmp=va_arg(arg,char);
			 putchar(tmp);
		     }
		    break;
		case 's':
	    	{
				char*str=va_arg(arg,char*);
				while(*str)
				{
					putchar(*str);
					str++;
				}
		    }
			break;
		default:
				putchar(*format);
				break;


		}
		format++;
		
	}
	va_end(arg);


}
int main()
{
	print("s cccc.\n","hello",'w','o','r','d');
	system("pause");	
	return 0;
}


     函数声明了一个变量va_arg,用来访问可变参数列表未确定的部分。va_start来初始化这个变量,第一个参数是va_list创建变量的名字,第二个参数是省略号前的参数。初始化过程是使va_arg指向可变参数部分的第一个参数。

    //va_arg(arg,char)//访问参数时需使用va_arg,第一个参数是va_list变量,第二个参数是参数列表中下一个参数的类型。

    //va_end(arg)//把arg赋成NULL

    这几个宏转到定义处为:

  va_list      typedef char* va_list

  va_start   #define va_start _crt_va_start   再转到定义处为#define _crt_va_start(ap,v)  ( ap =                                      (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )   作用是让指针arg找到第一个可变参数

    va_arg   #define _crt_va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )  

   va_end   #define _crt_va_end(ap)      ( ap = (va_list)0 )

总结:

     可变参数列表是通过宏来实现的,宏无法判断参数的类型和个数,所以需使用命名参数。




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值