printf详解:可变参数详解及Printf 实现方法



在开发MTK时候总习惯直跟踪代码跳进去看个究竟看到dbg_pr(char *fmt,...) 这个看了发现它实现了我从前直疑惑个问题Prf格式化输出是如何实现查了些有关可变参数资料并把mtk中prf格式化实现方式附上,希望对大家有用: 

1.要在中使用参数,首先要包含头文件<stdarg.h>这个头文件声明了个va_list类型定义了 4个宏用来遍历可变参数列表

void va_start(va_list ap, last);

type va_arg(va_list ap, type);

void va_end(va_list ap);

void va_copy(va_list dest, va_list src);

下面详细介绍这些宏定义:

2.void va_start(va_list ap, last)

va_start必须第化va_list类型变量ap使ap指向第个可选参数参数 last 是可变参数列表(即原型中省略号…)个参数名字也就是最后类型已确定参数名这个参数地址将会被宏va_start用到所以最好不要是寄存器变量或者

对于有可变长参数但是在可变长参数前没有任何固定参数 func (...)是不允许 这是ANSI C所要求变参在...的前至少得有个固定参数这个参

数将被传递给va_start然后用va_arg和va_end来确定所有实际时可变长参数类型和值

type va_arg(va_list ap, type)
宏va_arg展开后是有关下个参数类型和值表达式参数type是明确类型名
va_arg返回参数列表中当前参数并使ap指向参数列表中个参数

void va_end(va_list ap)
每次va_start就必须相应va_end销毁变量ap即将指针ap置为NULL

void va_copy(va_list dest, va_list src)
复制va_list类型变量
每次va_copy也必须有相应va_end

者在实际参数个数可变要通过思路方法指明实际参数个数例如把最后个参数置为空串(系统execl就是这样)、-1或其他方式(

prf就是通过第个参数即输出格式定义来确定实际参数个数)

3. 举例:



# <iostream.h>
# <stdarg.h>


{ a,b,c,d,e;
max(,...);
cin>>a>>b>>c>>d>>e;
cout<<"The bigger between a and b is "<<max(2,a,b)<<endl;
cout<<"The bigger in the five number is "<<max(5,a,b,c,d,e)<<endl;
0;
}

max( num, eger...)
{ va_list ap;
m=eger;
va_start(ap,eger);
for( i=1;i<num;i)
{ t=va_arg(ap,);
(t>m) m=t;
cout<<i<<endl;
}
va_end(ap);
m;
}
附:MTK中dbg_pr实现:



void dbg_pr(char *fmt,...)
{
va_list ap;
double dval;
ival;
char *p, *sval;
char *bp, cval;
fract;
unsigned len;
char buffer[1000];
mem(buffer,0,1000);
bp= buffer;
*bp= 0;
va_start (ap, fmt);
for (p= fmt; *p; p)
{
(*p != '%')
{
*bp+ *p;
continue;
}
switch (*p) {
'd':
ival= va_arg(ap, );
(ival < 0){
*bp+ '-';
ival= -ival;
}
itoa (&bp, ival, 10);
;

'o':
ival= va_arg(ap, );
(ival < 0){
*bp+ '-';
ival= -ival;
}
*bp+ '0';
itoa (&bp, ival, 8);
;

'x':
ival= va_arg(ap, );
(ival < 0){
*bp+ '-';
ival= -ival;
}
*bp+ '0';
*bp+ 'x';
itoa (&bp, ival, 16);
;

'c':
cval= va_arg(ap, );
*bp+ cval;
;

'f':
dval= va_arg(ap, double);
(dval < 0){
*bp+ '-';
dval= -dval;
}
(dval >= 1.0)
itoa (&bp, ()dval, 10);

*bp+ '0';
*bp+ '.';
fract= ()(dval- (double)()dval);
itof(&bp, fract);
;

's':
for (sval = va_arg(ap, char *) ; *sval ; sval )
*bp+ *sval;
;
}
}
*bp= 0;
// prf(buffer);这里已经得到了我们想要输出整个内容
va_end (ap);
}
Tags:  printf如何实现 printf的参数 printf参数 printf详解

延伸阅读

最新评论

发表评论