關於c語言可變參數的取得

#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;
}

一直想搞明白可變參數的問題,經過三天的努力,終於有點眉目了.寫下記錄,備忘備查

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章