va_list,va_start,va_end,等的说明

库里的头文件:

#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

 

#define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )

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

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

 


 

对于 _INTSIZEOF ,它的作用是将占据124个字节大小的数据类型算出的结果都成为48个字节的还是8个字节。为什么要转换呢?我认为是,不确定参数的传递,C语言采用的强制转换,char ,short,等都是强制转换成int型,float类型的强制转成double类型。因此在va_arg(ap,t)  时就需要将数据类型的字节大小转变。

 

va_start(ap,v) 是将ap这个指针指向v的地址+v的大小,如下面的程序就是指向第一个不定参数

 

va_arg(ap,t) 有两个作用:第一,将ap指向下一个参数,第二,返回一个参数值

 

va_end(ap) 将ap指针NULL,无效化。

 

#include <windows.h>
#include <stdio.h>

void CDECL mysprintf(char *buf, const char *format,...)
{
	
	va_list pArgs;
	
	int x = 0;
	
	double y = 0;
	
	int z = 0;
	
	va_start (pArgs, format);
	
	x = va_arg(pArgs, int);
	
	y = va_arg(pArgs, double);
	
	z = va_arg(pArgs, int);
	
	va_end (pArgs);
	
	
	
	va_start (pArgs, format);
	
	vsprintf (buf,format,pArgs);
	
	va_end (pArgs);
}


int main()
{	
	char buf[1024] = {0};
	
	mysprintf(buf,"%d,%f,%d",1,2.3,6);
		
	return 0;
}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值