库里的头文件:
#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 ,它的作用是将占据1,2,4个字节大小的数据类型算出的结果都成为4,8个字节的还是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;
}