中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
请问va_list用法
作者:未知 时间:2005-09-13 19:19 出处:ChinaUnix.net 责编:chinaitpower
              摘要:请问va_list用法

请问各位高手
         va_list;
         va_start (va_list pvar ,void parmn);
              va_end (va_list pvar);
究竟是具体如何实现变换函数参数的?               Thank u

 taige 回复于:2003-03-13 09:31:40
给你两个例子看一下:
[code:1:b86485fddf]int ErrLog(char *fmt, ...)
{
    FILE *fp;
    char logfile[255];
    va_list args;

    va_start(args, fmt);

    sprintf(logfile, "%s/log/%s.err.%s.log", getenv("HOME"), srv_name, GetSysDate(0));
    fp = fopen(logfile, "a+");
    if (fp == NULL) {
        fprintf(stderr, "open run log file[%s]error: %s\n", logfile, strerror(errno));
        return -1;
    }
    fprintf(fp, "[%s %s][%ld:%ld][%s][%s]\n", GetSysDate(1), GetSysTime(), getpgrp(), getpid(), bank_name, strerror(errno));

    vfprintf(fp, fmt, args);
    fclose(fp);
    va_end(args);

    return 0;
}
[/code:1:b86485fddf]
[code:1:b86485fddf]
int printv(char *fmt, ...)
{
    va_list args;

    if (verbose == 0)
        return 0;

    va_start(args, fmt);
    vfprintf(stderr, fmt, args);
    va_end(args);

    return 0;
}
[/code:1:b86485fddf]

 waitingfly 回复于:2003-03-13 10:05:41
va_list args
定义了什么?在函数中有何用处?你的错误日志中好象并没有?
只是申明?麻烦你能说明一下 :)
谢谢

 taige 回复于:2003-03-13 10:35:52
[code:1:ed806700e1]va_list args;[/code:1:ed806700e1]
定义了变量args啊!这都看不懂?
错误日志中当然用到了
[code:1:ed806700e1]va_start(args, fmt);[/code:1:ed806700e1]


一般的用法是这样(个人理解)
va_list args; //声明变量
va_start(args, fmt); //开始解析。args指向fmt后面的参数
TYPE var = va_arg(args, TYPE); //取下一个参数并返回。args指向下一个参数
va_end(args); //结束解析

 waitingfly 回复于:2003-03-13 11:32:23
非常感谢!
我明白了! :)

 thesea 回复于:2003-07-29 13:59:20
请问:
这种变元参数的函数printv,我想在参数列表中增加两个参数,用以标识调用printv的文件名和当前行数,如何定义参数列表?如何调用呢?
另外:
谁有比较好用的日志函数,共享一下。
谢谢

 lxbcd 回复于:2003-10-23 10:43:47
这是我已经编好的程序,共享吧!!!

int printv( char *psMsg, int iSqlcode, char *psFile, long lLine )
{
        FILE *fp_log;
        char sFile[255];
        char sDate[9],sTime[7];

        sprintf(sFile,"%s/log/err.log",getenv("HOME"));
        if((fp_log=fopen(sFile,"a"))!=NULL)
        {
                acc_getrqsj(sDate,sTime);
                fprintf(fp_log,"时间:%s%s|文件:%s|行数:%d|%s|数据库错码:%d|\n",
                        sDate+4,sTime,psFile,lLine,psMsg,iSqlcode);
        }
        fclose(fp_log);
        return 0;
}
[code][/code]

 scholes00 回复于:2003-12-18 15:59:49
可以查看/usr/include/目录下va_list.h和stdarg.h

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有