#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语言可变参数的取得
最新推荐文章于 2021-11-12 17:26:45 发布