[此消息最初于2001年5月27日发送给一位询问如何构造可变参数列表的人。我已对文本进行少量编辑,以便在网页上显示。]

发件人:scs@eskimo.com (Steve Summit)
日期:2001年5月27日,星期日,10:49:32 -0500
Message-Id: <2001May27.1049.scs.009@aeroroot.scs.ndip.eskimo.net>
主题:Re: C中的可变参数列表

你写道
> 你好,我一直在谷歌上搜索一种构建va_list类型变量的方法。我的任务是让一个函数接受可变数量的参数,
> 从列表中移除一些参数,然后将va_list传递给另一个函数,可能是vprintf或vsprintf……
> 你知道这该如何实现吗?我需要
> 简单地从我从第一个函数调用中获得的va_list中移除参数,或者构建一个新的va_list并省略不需要的参数。
> 你知道这该如何实现吗?我需要
> 简单地从我从第一个函数调用中获得的va_list中移除参数,或者构建一个新的va_list并省略不需要的参数。
> 简单地从我从第一个函数调用中获得的va_list中移除参数,或者构建一个新的va_list并省略不需要的参数。

好吧,这个问题有两个非常不同的答案。第一个是根本没有一种可移植的方法可以做到这一点;“解决方案”要么涉及汇编语言,要么涉及可怕的折衷方法,或者两者兼而有之。如果可能的话,你应该找其他方法来完成你的更高层任务,而不是试图动态地构建或操作参数列表。卷入动态参数列表就像卷入苦艾酒:起初是黑暗而奇特且令人兴奋,但最终会具有破坏性和思维退化性。

这是严肃、负责任的答案。第二个答案是,动态函数调用确实是奇特、令人兴奋且充满乐趣的。但它们并不容易;它们确实需要汇编语言或可怕的折衷方法(或两者兼而有之)。这就是《comp.lang.c FAQ列表》中的第15.13个问题所讨论的内容;我在本消息的末尾附加了我的“古怪想法”合集。除了那里的想法之外,最近我在使用一套gcc扩展方面进展顺利__builtin_apply_args, __builtin_apply,而__builtin_return。(我无法告诉你如何使用它们,因为我自己也很少理解它们,但如果你正在使用gcc,它们可能是一个选择。我知道的唯一文档是gcc Info节点“Constructing Calls”。)

Steve Summit
scs@eskimo.com