C 中解决可变参数的几组宏 va_start、va_arg、va_end等

来源:互联网 发布:淘宝 优惠券 设置 编辑:程序博客网 时间:2024/06/12 01:17

在C语言中有时候会用到可变参数,利用va_list这组宏就可以解决:

 #include <stdarg.h>       void va_start(va_list ap, last);       type va_arg(va_list ap, type);       void va_end(va_list ap);       void va_copy(va_list dest, va_list src);


va_list的用法

(1)首先在函数里定义一个va_list型的变量,这个变量是指向参数的指针

(2)然后用va_start宏初始化变量刚定义的va_list变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数。(如在运行va_start(ap,fmt)以后,ap指向第一个可变参数在堆栈的地址。)

(3)然后用va_arg返回可变的参数,va_arg的第二个参数是你要返回的参数的类型。

(4)最后用va_end宏结束可变参数的获取。然后你就可以在函数里使用第二个参数了。如果函数有多个可变参数的,依次调用va_arg获取各个参数。

用法示例:va_test.c

#include <stdio.h>#include <string.h>#include <stdarg.h>#define DEBUG#define Log_file "./log.txt"int DoSystem(char *fmt, ...){        va_list vargs;        char cmd[1024]=" ", *para;        char buf[256]=" ";        int rc = 0;        int n, fmtn=0;        va_start(vargs, fmt);//这里fmt必须是...的前一个参数.        n = vsnprintf(cmd, sizeof(char)*1024, fmt, vargs);//将变参列表 vargs 以fmt格式化打印到cmd中        while ( fmtn<3 ){                para = va_arg( vargs, char *);//获取每一个参数值                if ( strcmp(para, "") == 0 )                        break;                fmtn++;                printf("fmtn = %d ,fmt=%s\n",fmtn,para);                //memset(para,0,sizeof(para));        }        va_end(vargs);        if (n > 0) {        #ifdef DEBUG        fprintf(stderr, "%s\n", cmd);        //sprintf(cmd,"%s > log.txt",cmd);        rc = system(cmd);        #endif        }        return rc;}int main(){        char buff[]="al";        char buff1[]="-";        DoSystem("ls %s%s > %s",buff1,buff,Log_file);  //DoSystem("ps -ef | grep ps",buff);        return 0;}

编译结果: