问题标签 [variadic-functions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
4424 浏览

python - 什么时候应该在设计 Python API 时使用可变参数?

关于何时应该更喜欢 API 中的 varargs 函数签名而不是将可迭代对象传递给函数,是否有一个好的经验法则?(“varargs”是“variadic”或“variable-number-of-arguments”的缩写;即*args

例如,os.path.join具有可变参数签名:

min允许:

any/all只允许一个可迭代的:

0 投票
3 回答
2525 浏览

c++ - 在 C++ 中包装可变参数函数

我想用另一个函数(也采用可变数量的参数)包装 xmlrpc“调用”函数(它接受可变数量的参数)。我想简单地将传入我的包装函数的可变数量的参数转发给 xmlrpc“调用”函数。我知道如何使用 va_start 和 va_arg,但我真的不关心传入的值,我只是想将它们转发给包装函数。这可能吗?

我想包装的功能的规格是

我的包装器处理前三个参数和按引用的结果,它只需将其额外参数转发给调用函数

0 投票
1 回答
5302 浏览

c - C varargs - va_copy 问题

我正在用 C 语言编写一个带有可变数量参数的函数。

到现在为止还挺好。我决定最好以正确的方式做事,并制作一个带有可变参数的版本,以及另一个带有va_list.

没那么难做到。除了my_vprintf()需要将其发送args到两个不同的函数(首先到snprintf()长度为 0 来确定我们需要多少空间,然后sprintf()在我们分配了那么多空间之后)。我用va_copy.

这一切都很好而且很花哨,但是 C99 的实现有点糟糕。如果可能的话,我希望我的代码也能在 C89 中工作,并与尽可能多的编译器和尽可能多的平台一起工作。我目前#include <stddef.h>在任何代码之后但之前有这个:

我被引导相信这((a)=(b))是不可靠的,我也许应该使用memcpy()或类似的东西,但这仍然是“如果你不支持 C99,我希望它有效”而不是“如果你不支持C99,永远不要害怕”(这就是我想要的)。有什么好的方法可以绕过这个限制吗?我已经看到了一些解决方案 -va_list吃一个参数并递归的函数,传递va_list两次以便制作两个单独的副本,等等 - 但我不知道它们会如何工作(递归解决方案不会做好吧,如果我只想打电话vsnprintf(),现在,会吗?)。

所以我求助于你,StackOverflow 用户。我还能做些什么来提供 C89 兼容性,还是没有用户(诚然很少va_copy__va_copy相差甚远)只是不得不将其吸入并接受它?

0 投票
4 回答
401 浏览

c - C中具有可变数量args的函数和一个面向设计的问题

我有一个以SetParams(...)可变数量参数命名的 C 函数。这个函数建立了一个静态数据结构(让我们命名它Data)。SetParams与成对的参数一起使用,例如SetParams("paramA", paramA_value, "paramB", paramB_value)等。它也可以被多次调用,e.g.

当所有“参数”都设置好后,调用另一个Execute不带参数的函数(让我们命名它):

我想知道是否可以以更面向对象的方式构造这种代码。所以,我想要一些建议,尤其是关于错误处理的建议,因为某些参数对可能与其他参数相矛盾。

0 投票
2 回答
980 浏览

scala - 在 Scala 中以编程方式设置重复参数

我正在尝试Futures.awaitAll使用可变数量的 well...进行呼叫FutureawaitAll定义为awaitAll(timeout : Long, fts : Future[Any]*)。我试过传入 aList和 anArray但两者都不起作用:

编辑:我现在想做的是Futures.awaitAll使用可变数量的参数(1到n)以编程方式调用。所以使用Futures.awaitAll(1000, future1, future2)不是一种选择。

Programming in Scala 的第 8.8 章也没有给我任何提示如何解决这个问题,所以欢迎提供帮助:)

0 投票
2 回答
1508 浏览

visual-studio - Visual Studio 2005 中的 x64 va_list

我有一个类非静态成员函数,它有可变参数,我在 64 位 Windows 上使用 64 位运行时在 Visual Studio 2005 上编译。

我期待一个浮点数,我将一个浮点数传递给函数。但是当我调试时 - 我没有得到我通过的浮点数。事实上 - 它被函数作为 64 位双精度接收!我必须这样做:

现在我知道 Win64 喜欢在寄存器中传递参数,并在这样做时转换浮点数,va_list 不应该总是在堆栈上吗?

根据大多数参考资料,我应该只有一个干净的堆栈,里面装满了传递的参数。

我的问题是:这是正确的行为,还是错误?如果它是一个错误,是我的错误,还是微软的?

我有定义 WIN64 和 _M_AMD64,而 WIN32 是未定义的。

0 投票
2 回答
1229 浏览

java - 最具体的方法,同时匹配固定/可变参数(varargs)

Java Language Specification 的第 15.12.2.5 节中,它讨论了如何在具有固定数量的方法和可变数量的方法(即varargs)的两种情况下选择最具体的方法。

我在 JLS 中找不到任何关于在两种方法之间做出决定的方法,其中一种方法是固定参数,另一种方法是可变参数。例如:

正如人们所期望的那样编译(出于下面 Yoni 概述的原因)。此调用代码还编译:

如果你运行它,method #1(即非可变参数方法)被调用。为什么这个调用代码没有歧义?为什么固定数量的方法比可变数量的方法更具体?有人可以指出规范的相关部分吗?

0 投票
5 回答
7115 浏览

c - 如何将可变参数函数转换为宏?

我有一个可变参数函数,它在我的应用程序中打印错误消息,其代码如下:

该函数用于错误情况如下:

error()函数从不同的地方以不同的参数调用(可变参数函数)。

函数方法工作正常。

现在,如果我必须将此函数转换为宏,我该怎么做?我试着这样做:

但这不能正确打印参数。

上面的宏定义有什么问题?

解决方法是什么?

0 投票
5 回答
1119 浏览

c++ - 最后命名的参数不是函数或数组?

这个问题是关于可变参数函数,以及它们的最后一个命名参数,在省略号之前:

我正在阅读 C 标准,发现va_start宏有以下限制:

参数 parmN 是函数定义中可变参数列表中最右边参数的标识符(就在 , ... 之前的那个)。如果参数 parmN 使用寄存器存储类、函数或数组类型或与应用默认参数提升后产生的类型不兼容的类型声明,则行为未定义。

我想知道为什么以下代码的行为未定义

并且不是未定义的以下

这些宏旨在通过纯 C 代码实现。但是纯 C 代码无法确定paramN是声明为数组还是指针。在这两种情况下,参数的类型都被调整为指针。函数类型参数也是如此。

我想知道:这种限制的理由是什么?当这些参数调整在内部就位时,某些编译器是否在实现这一点时遇到问题?(同样的未定义行为也适用于 C++ - 所以我的问题也是关于 C++ 的)。

0 投票
2 回答
7552 浏览

actionscript-3 - 在 AS3 中展开 var args

我想知道是否有某种方法可以在 AS3 中解压缩可变长度参数列表。以这个函数为例:

如果我这样称呼:

result 现在包含一组嵌套的数组:

这里的问题是 args 参数被视为一个数组。因此,如果我将它传递给具有可变参数列表的函数,它将被视为单个参数。

在 Scala 中有一个 :_* 运算符,它告诉编译器将一个列表分解为一个参数列表:

我想知道 AS3 中是否存在将数组扩展为参数列表的技术/运算符。