printf函数
2007-04-10 15:03
190 查看
int DEFUN(printf, (format), CONST char *format DOTS)
{
va_list arg;
int done;
va_start(arg, format);
done = vprintf(format, arg);
va_end(arg);
return done;
}
可以看到printf其实在内部调用的是vprintf,通过查看vprintf.c中的内容,我们可以看到vprintf其实是通过vfprintf实现的,它的函数原型是这样的:
int DEFUN(vfprintf, (s, format, args),
register FILE *s AND CONST char *format AND va_list args)
这个函数的整体执行结构是这样的:
register CONST char *f; //可以看到f是一个const char的指针
f = format;
while (*f != '/0')
{
...
if (*f != '%')
{
...
}
if (*f == '%')
{
fc = *f++;
...
switch (fc)
{
case 'd':
...
case 'c':
...
....
}
}
}
从上面的结构我们可以看出,函数首先读取字符串中的字符,然后一个个比较,如果是%,则马上用switch...case结构判断后续字符
在每一个case语句块里面,都有这样的语句:
nextarg(...);
outchar(...);
nextarg()是一个宏,有如下宏定义
#define castarg(var, argtype, casttype) /
var = (casttype) va_arg(args, argtype)
#define nextarg(var, type) castarg(var, type, type)
一出现va_arg,我们就很熟悉了,这个宏的作用就是读取可变参数,在这里的作用就是将args中的内容读入。也就是利用栈顶指针读取
栈中的内容。
outchar(...)也是一个宏,它的定义如下
#define outchar(x) /
do /
{ /
register CONST int outc = (x); /
if (putc(outc, s) == EOF) /
RETURN(-1); /
else /
++done; /
} while (0)
{
va_list arg;
int done;
va_start(arg, format);
done = vprintf(format, arg);
va_end(arg);
return done;
}
可以看到printf其实在内部调用的是vprintf,通过查看vprintf.c中的内容,我们可以看到vprintf其实是通过vfprintf实现的,它的函数原型是这样的:
int DEFUN(vfprintf, (s, format, args),
register FILE *s AND CONST char *format AND va_list args)
这个函数的整体执行结构是这样的:
register CONST char *f; //可以看到f是一个const char的指针
f = format;
while (*f != '/0')
{
...
if (*f != '%')
{
...
}
if (*f == '%')
{
fc = *f++;
...
switch (fc)
{
case 'd':
...
case 'c':
...
....
}
}
}
从上面的结构我们可以看出,函数首先读取字符串中的字符,然后一个个比较,如果是%,则马上用switch...case结构判断后续字符
在每一个case语句块里面,都有这样的语句:
nextarg(...);
outchar(...);
nextarg()是一个宏,有如下宏定义
#define castarg(var, argtype, casttype) /
var = (casttype) va_arg(args, argtype)
#define nextarg(var, type) castarg(var, type, type)
一出现va_arg,我们就很熟悉了,这个宏的作用就是读取可变参数,在这里的作用就是将args中的内容读入。也就是利用栈顶指针读取
栈中的内容。
outchar(...)也是一个宏,它的定义如下
#define outchar(x) /
do /
{ /
register CONST int outc = (x); /
if (putc(outc, s) == EOF) /
RETURN(-1); /
else /
++done; /
} while (0)
相关文章推荐
- 【C语言】关于printf函数输出字符格式
- 05.黑马程序员-scanf函数、printf函数
- C语言,输出格式,printf函数输出格式用法
- 用scanf和printf函数进行输入和输出.cpp
- C++函数可变参数实现原理探究——以实现printf为例
- Java中的String构建器,以及printf()函数
- Java学习笔记——C语言格式输出函数printf()详解
- printf 函数的实现原理
- 实例详解printf函数用法
- printf函数参数入栈
- c语言输入输出函数printf与scanf
- printf() 函数压栈方式 从右到左压栈
- printf 函数原型
- C语言中的scanf和printf函数的返回值问题
- va_start()va_end()和vsnprintf()函数应用
- C语言的printf函数(格式输出函数)
- 逆向工程核心原理学习笔记(二十二):栈帧9:调用printf()函数
- printf函数的返回值!
- 从printf谈可变参数函数的实现
- 使用printf函数实现串口信息打印——设置IAR和Keil的Options