首页 > 代码库 > C 可变参数

C 可变参数

#include <stdio.h>#include <stdarg.h>extern char* baseconv(unsigned int,int); //格式化数字void miniprintf(const char *fmt,...){    const char* p;    int i;    unsigned u;    char* s;    va_list argp;    va_start(argp,fmt);    for(p=fmt;*p!=\0;p++)    {        if(*p!=%)        {            putchar(*p);            continue;        }                switch(*++p)        {            case c:                i=va_arg(argp,int);//“默认参数提升”规则,在可变参数部分                putchar(i);                break;            case d:                i=va_arg(argp,int);                if(i<0)                {                    i=-i;                    putchar(-);                }                fputs(baseconv(i,10),stdout);                break;            case o:                u=va_arg(argp,unsigned int);                fputs(baseconv(u,8),stdout);                break;            case s:                s=va_arg(argp,char*);                fputs(s,stdout);                break;            case u:                u=va_arg(argp,unsigned int);                fputs(baseconv(u,10),stdout);                break;            case x:                u=va_arg(argp,unsigned int);                fputs(baseconv(u,16),stdout);                break;            case %:                putchar(%);                break;        }    }    va_end(argp);}

关于可变参数的部分,仔细想想的话:应该是把所有的参数放到了一个块内存中,然后将数据一个个取出来。但是取出来的时候要定义类型,每个类型确定了取出来的内存的大小。

ps:定义函数时第一个参数不能缺少吧,然参数的开始地址怎么找,至少要给个名字(地址)

va_arg(argp,var_Type);

C 可变参数