標籤:utc blog 字元 char hit AC stream ace ++
原文轉自 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); }
c /c++變參函數(轉)