C语言变长参数实现最简例程(printf函数实现原理解释)
首先看代码,代码可直接运行
#include<stdio.h>
#include<stdarg.h> /* 必须要包含的头文件 */
#define END (-1) /* 用于定义参数结尾 */
/**
* 对n个int型正整数做累加
*/
long dtxk_add(int start, ...)
{
long sum = 0;
int tmp = 0;
va_list ap;
sum += start;
va_start(ap, start); /* 使指针ap指向第一个参数 */
while((tmp = va_arg(ap, int)) != END) /* 获取参数并判断是否到达结尾 */
{
sum += tmp;
}
va_end(ap);
return sum;
}
/**
* 主程序
*/
int main(int argc, char *argv[])
{
printf("sum = %ld\n", dtxk_add(1, 2, 3, 4, END)); /* 输出结果10 */
printf("sum = %ld\n", dtxk_add(5, 6, END)); /* 输出结果11 */
return 0;
}
代码解释
关键函数:
va_start
va_arg
va_end
关键变量:
va_list ap;
va_list 类型用于声明一个变量,该变量将依次引用各参数。
注意,此处默认了全部参数均为int类型。
printf函数实现原理解释
示例代码:printf(“a=%d,b=%f”, 10, 0.2);
在这里,字符串**“a=%d,b=%f”**为第一个参数,实现步骤:
- 使用一个char *指针p指向字符串 "a=%d,b=%f"
- 输出指针p指向的字符,直到遇到符号 %
- 判断符号%后面的字母,如果为字母d,则调用函数va_arg(ap, int),如果为字母f,则调用函数va_arg(ap, double) 以此类推
- 直到*p的值为’\0’, 结束,执行函数va_end(ap)
注意:这里通过%d等占位符即指明了参数的数量,又指明了参数的类型,所有不需要前面代码里的END作为结尾标志。
其他注意点:省略号…只能出现在参数的尾部!