| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 682 人关注过本帖
标题:说真的 我真的看不懂这两个东西
只看楼主 加入收藏
linkang1024
Rank: 2
等 级:论坛游民
帖 子:90
专家分:83
注 册:2011-10-10
结帖率:70.83%
收藏
已结贴  问题点数:14 回复次数:9 
说真的 我真的看不懂这两个东西
static void err_doit(int ,char *,va_list)



void err_ret(const char *fmt,...)
{
    va_list ap;
    va_start(ap,fmt);
    err_doit(1,fmt,ap);
    va_end(ap);
    return;
}

static void err_doit(int errnoflag,const char *fmt,va_list ap)
{
    int errno_save;
    char buf[MAXLINE];
    errno_save=errno;
    vsprintf(buf,fmt,ap);
    if(errnoflag)
        sprintf(buf+strlen(buf)),
    strcat(buf,"\n");
    fflush(stdout);
    fputs(buf,stderr);
    fflush(NULL);
    return;
}


我最不懂的就是va_list这个东西   我看了N多次 ,也没发现这va_list是个结构体,这是(unix环境高级编程)出错处理定义的函数,不知道有没有看过的?懂的解释下?
搜索更多相关主题的帖子: return void 
2012-09-20 10:10
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:2 
你看他的就是附录都有啊。
这本书还没有看,steven 经典书籍。

一般一些定义他自己的定义东西都在附录里面。

一些特别的头 你到网上下载。

用心做一件事情就这么简单
2012-09-20 10:39
linkang1024
Rank: 2
等 级:论坛游民
帖 子:90
专家分:83
注 册:2011-10-10
收藏
得分:0 
回复 楼主 linkang1024
唉 不知道我眼花还是怎么的   我真的找不到.....
2012-09-20 11:12
Andony
Rank: 2
等 级:论坛游民
帖 子:38
专家分:60
注 册:2012-9-12
收藏
得分:2 
我帮你在linux内核里找下这个结构体

重复的事情用心做,你就是赢家
2012-09-20 11:14
xiaofei12
Rank: 2
等 级:论坛游民
帖 子:3
专家分:12
注 册:2012-9-20
收藏
得分:2 
这个结构体
2012-09-20 11:26
db20103548
Rank: 2
来 自:辽宁沈阳
等 级:论坛游民
帖 子:9
专家分:11
注 册:2012-9-16
收藏
得分:2 
    typedef struct
        {
           char *a0;       // pointer to first homed integer argument
           int offset;     // byte offset of next parameter
        } va_list;

    va_list的用法:      
       (1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针;
       (2)然后用VA_START宏初始化变量刚定义的VA_LIST变量;
       (3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用VA_ARG获取各个参数);
       (4)最后用VA_END宏结束可变参数的获取。
2012-09-20 11:56
linkang1024
Rank: 2
等 级:论坛游民
帖 子:90
专家分:83
注 册:2011-10-10
收藏
得分:0 
回复 6楼 db20103548
  在哪找的? 我也想去看看  
2012-09-20 13:53
happy0553
Rank: 1
等 级:新手上路
帖 子:3
专家分:2
注 册:2012-9-20
收藏
得分:2 
学习了!
2012-09-20 16:03
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:2 
程序代码:
#include <stdio.h>
#include <stdarg.h> /* va_arg() va_end() va_start */

int add(int num, ...)
{
    int sum = 0;
    va_list args;
    
    va_start(args, num);
    while (num--)
        sum += va_arg(args, int);
    va_end(args);
    return sum;
}

int add2(int num, ...)
{
    int   sum = 0;
    void* args; /* va_list args; */
  
    args = &num + 1; /* va_start(args, num); */  
    while (num--)
        /* 其实这段代码会更好,但是编译无法通过:*((int*)args)++; */
        sum += *((int*)(args = (int*)args + 1) - 1); /* sum += va_arg(args, int); */
    args = 0; /* va_end(args); */
    return sum;
}

int main(void)
{
    /* 1+2+3+4+5=? */
    printf("%d\n", add(5, 1, 2, 3, 4, 5));
    printf("%d\n", add2(5, 1, 2, 3, 4, 5));
    return 0;
}


add2是对可变参数宏的实现猜想。

My life is brilliant
2012-09-20 17:55
青春无限
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江苏
等 级:贵宾
威 望:24
帖 子:3451
专家分:19340
注 册:2012-3-31
收藏
得分:2 
[em06努力

学 会看代码…学习写程序…学会搞开发…我的目标!呵呵是不是说大话啊!!一切皆可能
2012-09-20 18:48
快速回复:说真的 我真的看不懂这两个东西
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012749 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved