从main.c中的printf开始读这个函数。
首先看printf函数的定义:
1
static int printf(const char *fmt, ...)
2
{
3
va_list args;
4
int i;
5
6
va_start(args, fmt);
7
write(1,printbuf,i=vsprintf(printbuf, fmt, args));
8
va_end(args);
9
return i;
10
}
参数中明显采用了可变参数的定义,而在main.c函数的后面直接调用了printf函数,我们可以看下printf函数的参数是如何使用的。
1
printf("%d buffers = %d bytes buffer space/n/r",NR_BUFFERS,
2
NR_BUFFERS*BLOCK_SIZE);
3
printf("Free mem: %d bytes/n/r",memory_end-main_memory_start);
先来分析第一个printf调用:
printf("%d buffers = %d bytes buffer space/n/r",NR_BUFFERS, NR_BUFFERS*BLOCK_SIZE);
可以看到*fmt等于"%d buffers = %d bytes buffer space/n/r”,是一个char 类型的指针,指向字符串的启始位置。而可变的参数在这里是NR_BUFFERS和NR_BUFFERS*BLOCK_SIZE。
其中NR_BUFFERS在buffer.c中定义为缓冲区的页面大小,类型为int;BLOCK_SIZE在fs.h中的定义为
#define BLOCK_SIZE 1024
因此两个可变参数NR_BUFFERS和NR_BUFFERS*BLOCK_SIZE都为int类型;
以前已经分析过可变参数的一系列实现函数va函数。
va_list arg_ptr;
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
首先在函数里定义一个va_list<