#include <stdio.h>
#include <stdarg.h>
typedef char* va_list;
#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 ) // 将指针置为无效
void outArgs(const char* a, ...);
void outInt(int i)
{
printf("%d", i);
}
void outFloat(float i)
{
printf("%f", i);
}
void outArgs(const char* fmt, ...)
{
va_list arg_ptr;
char cTmp = 0;
char* ssTmp = 0;
int iTmp = 0;
float fTmp = 0;
const char* p = fmt;
va_start(arg_ptr, fmt);
while((*p) != 0){
if(*p != '%'){
putchar(*p);
p++;
continue;
}
else{
p++;
switch(*p){
case 'd':
iTmp = va_arg(arg_ptr, int);
outInt(iTmp);
break;
case 'c':
cTmp = va_arg(arg_ptr, char);
putchar(cTmp);
break;
case 'f':
fTmp = va_arg(arg_ptr, float);
outFloat(fTmp);
break;
case 's':
ssTmp = va_arg(arg_ptr, char*);
puts(ssTmp);
break;
}
p++;
continue;
}
}
va_end(arg_ptr);
}
void main()
{
outArgs("My name is wwy:%d %d %d %f", 1000, 3, 15, 185.00);
}
今天研究了下 printf(const char*, ...); 函数的构成,顺便理解并实践了下可变参函数。
写可变参函数需要引用头文件 stdarg.h 打开该文件可以发现主要内容如下:
typedef char* va_list;
#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 ) // 将指针置为无效
参考这个帖子吧,很详细。
http://www.ibm.com/developerworks/cn/linux/l-va/index.html