关于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;
}

一直想搞明白可变参数的问题,经过三天的努力,终于有点眉目了.写下记录,备忘备查

 

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