c /c++变参函数(转)
原文转自 https://blog.csdn.net/wwzcx/article/details/8940092
实现c/c++语言的变参函数。
变参函数 :void fun(para,...)
变参函数必须要有一个固定参数。
在头文件stdarg.h中定义了三个宏可以用到:
void va_start(va_list arg, prev_param );
type va_arg(va_list arg, type );
void va_end(va_list arg );
va在这里是variable-argument(可变参数)的意思.
那么变参函数的实现就变得相对简单很多。
一般的变参函数处理过程:
①定义一个va_list变量设为va
②调用va_start()使得va存放变参函数的变参前的一个固定参数的地址。
③不断调用va_arg()使得va指向下一个变参。
④最后调用va_end()表示变参处理完成。
原理就是:函数的参数在内存中从低地址向高地址依次存放。
看一个例子:模仿pritnf的实现:
#include<iostream> #include<stdarg.h> #include<string.h> using namespace std; void func(char *c,...){ int i=0; double result=0; va_list arg; //va_list变量 va_start(arg,c); //arg指向固定参数c while(c[i]!='\0'){ if(c[i]=='%'&&c[i+1]=='d'){ printf("%d",va_arg(arg,int)); i++; } else if(c[i]=='%'&&c[i+1]=='f'){ printf("%f",va_arg(arg,double)); i++; } else { char newc[2] = {c[i]}; //将字符转换为字符串输出,也可以用putchar() printf("%s",newc); } i++; } va_end(arg); } int main(){ int i=100; double j=100.0; printf("%d be equal %f\n",i,j); func("%d be equal %f\n",i,j); }