附录A printf、varargs与stdarg A.2 使用varargs.h来实现可变参数列表

本文介绍了如何使用varargs.h库在C语言中实现类似printf的可变参数列表函数。通过varargs宏,如va_list、va_start、va_arg和va_end,可以访问和处理变长参数列表,尽管需要注意参数类型转换和结束标志的设定。
摘要由CSDN通过智能技术生成

    A.2 使用varargs.h来实现可变参数列表
    在编写C程序的过程中,随着程序规模的增大,程序员经常感到有必要进行系统化的错误处理。 
    error("%d is out of bounds", x);
    就与下式等效 
    fprintf(stderr, "error: %d is out of bounds\n", x);
    exit(1);
    只有一个小细节“梗”住了我们:error函数的参数数目与类型在不同的调用间并非一成不变,而是像printf函数那样可能随调用的不同而变动。一个典型的解决之道是把error函数写成像下面这样,可惜这种做法并不正确: 
    void error(a, b, c, d, e, f, g, h, i, j, k);
    {
        fprintf(stderr, "error:");
        fprintf(stderr, a, b, c, d, e, f, g, h, i, j, k);
        fprintf(stderr, "\n");
        exit(1);
    }
    因为函数a到k并没有声明,所以它们默认为int类型。当然,error函数至少包括了一个非int类型的参数(即格式字符串)。因此,这个程序能够正常工作就依赖于是否可以用一组整型参数来复制任意类型的数值。 

    printf函数的第一个参数必须是一个字符串,我们可以通过检查这个字符串来得到其他参数的数目与类型(当然,假定printf函数的调用是正确的)。
    为了便于printf函数的实现,这样一种机制就应该拥有以下特性。
    *只需要知道函数的第一个参数的类型,就可以对其进行存取。
    *一旦第n个参数被成功地存取,第n+1个参数就可以在仅知道类型的情况下进行存取。
    *按这种方式存取一个参数所需的时间不应太多。
    需要特别注意的是,逆向存取参数,或者随机存取参数,或者以任何非从头到尾的顺序方式来存取参数,都是不必要的。进一步来说,检测参数列表是否结束通常既不必要,也不可能。
    大多数C语言实现都是通过一组总称为varargs的宏定义来达到上述目的。这些宏的确切定义虽然与特定的C语言实现有关,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值