#define _vlst (char *) #define _intsize(n) ((sizeof(n)+sizeof(int)-1)&(~(sizeof(int)-1))) #define _vastart(ap,v) (ap=_vlst(&v)+_intsize(v)) #define _vaarg(ap,t) (*(t*)((ap+=_intsize(t))-_intsize(t))) #define _vaend(ap) (ap=(void*)0) #include <stdio.h> #include <math.h> /* * 返回可變參數,並且設第一個參數是字符串 ,後面的參數是 double類型 */ char strbuf[210]={0}; //函數應用中三種可以返回字符串的定義之一 char * retParam(int v,...) { //這個定義成了全局變量,在函數外部了,感覺不好 char *ap=NULL; // char *strbuf=(char*)malloc(sizeof(char)*210); //函數應用中三種可以返回字符串的定義之二 // static char strbuf[210]={0}; //函數應用中三種可以返回字符串的定義之三 _vastart(ap,v); //用宏取得第一個可變參數的地址 char **s = (char**)ap; //按照約定取字符串參數 printf("*s=%p \n",*s); //字符串存儲在靜態存儲區 _vaarg(ap,int); //調整到 字符串參數後面的參數地址 double d1 = _vaarg(ap,double); //取得 第二個參數的值,並將指針向後移動到第三個參數 double d2 = _vaarg(ap,double); //取得第三個參數的值,並將指針向後移動到第四個參數 double d3 = _vaarg(ap,double); //取得第四個參數的值,... sprintf(strbuf,"%s,%f,%f,%f",*s,d1,d2,d3); //將取得的參數存入返回值中 _vaend(ap); //釋放指針 _vaend(*s); _vaend(s); return strbuf; } int main(){ char * result = retParam(4,"abcdefghijklmn",M_PI,M_PI_2,M_PI_4); printf("RES=%s \n",result); result = (char*)&("abcdefghijklmn");//證明了字符串存儲在靜態存儲區,函數退出後並沒有被釋放 printf("RES=%p \n",result); //地址跟函數內部打印的一樣 return 0; }
一直想搞明白可變參數的問題,經過三天的努力,終於有點眉目了.寫下記錄,備忘備查
關於c語言可變參數的取得
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.