printf这个学C语言第二个用的函数,(第一个是main,哈哈哈)。对于它的参数。int printf(char const* const _Format, ...)这里的...可以输入若干个参数,这究竟是如何实现的呢?代码一敲就能搞清楚了。
int CountParams(int iV, ...)
{
va_list pArgsList;
int * pInt = &iV;
printf("A : ");
for (int i = 0; i < iV; i++)
{
pInt++;
printf("%d", *pInt);
}
va_start(pArgsList, iV);
printf("\nB : ");
for (int i = 0; i < iV; i++)
{
printf("%d", va_arg(pArgsList, int));
}
va_end(pArgsList);
return iV;
}
CountParams(2, 1, 2);
这段代码,就能看出va_list是怎么工作的了。
运行结果是
A : 12
B : 12
结果是一样的。
1.va_list
从这就能直接分析出,实际上va_list只是一个指针,调试后发现,在va_start时会初始化va_list指针,会让他指向iV的后面的位置。
2.va_start(1,2)
参数一:是va_list的指针变量
参数二:是任意变量。(当然是变参数的前一个参数)
在va_start时会初始化va_list指针,会让他指向iV的后面的位置。
3.va_arg(1,2)
参数一:是va_list的指针变量
参数二:是变量的类型(实际上就是指定下一次这个va_list指针向后偏移的距离)
这里一定是用sizeof
返回的是下一个参数
4.va_end(1)
是va_list的指针变量
也就是释放内存操作。
以上分析完成,那怎么实现printf就明了了,参数第一个是一个格式化字符串,然后va_start之后,开始循环分析格式化串,然后根据%某某,去指定va_arg第二个参数,去读取内容,并替换字符串对应位置。