问题标签 [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 回答
38093 浏览

c - 将省略号传递给另一个可变参数函数

我有大约 30 个可变参数函数。每个都接受一个路径作为最后的参数,例如:

在每个函数中,我必须检查扩展格式是否小于或等于某个大小。所以,我发现自己复制/粘贴相同的代码块来检查有多少字符vsnprintf()没有打印,errno相应地设置并退出写入。

我想做的是编写一个函数来执行此操作,它将返回一个已知为安全大小的静态分配(扩展)字符串,或者在失败时返回新初始化的字符串,可以针对 NULL 进行检查。检查还必须确定字符串是绝对路径还是相对路径,这会影响字符串的安全大小。这是很多重复的代码,它开始闻起来了。

有没有办法可以将省略号的内容从我的函数条目传递给另一个函数?还是我必须先调用va_start(),然后将其传递va_list给辅助函数?

编辑:

我一点也不反对将它传递va_list给助手,我只是想确保没有其他东西存在。在我看来,编译器理解可变参数从哪里开始,所以我只是好奇我是否可以告诉它传递它们。

0 投票
8 回答
167402 浏览

java - 你什么时候在 Java 中使用可变参数?

我害怕可变参数。我不知道用它们做什么。

另外,让人们随意传递尽可能多的论点感觉很危险。

什么是使用它们的好地方的上下文示例?

0 投票
1 回答
418 浏览

string - 你能 PInvoke 多字节 ANSI 到可变参数吗?我究竟做错了什么?

** 重大更新 ** 我犯了一个小错误,但我仍然对到底发生了什么感到好奇。

我调用的函数实际上是“fooV”,一个带有这个签名的函数:

这清除了我得到的 AccessViolationExceptions,但没有解释为什么 params 参数适用于所有其他 .NET 类型,除了必须转换为多字节 ANSI 字符的字符串。我将让 DLL 的开发人员在参数列表中公开实际使用的版本 ...,如果 va_list 是参数,是否有任何关于 PInvoking 的提示?

** 旧帖 **

这与我最近提出的问题有关,但不同。

我必须使用 PInvoke 调用具有以下签名的 C 库函数:

该函数以一种因 StructType 而异的方式配置资源;我感兴趣的情况配置了一些期望可变参数是单个 ANSI 多字节字符串的东西。我使用此 PInvoke 签名来调用该函数:

params string[]对我来说似乎很奇怪,但是以前调用此函数的签名将其用于其他类型,例如bool我遵循了该模式。

我用一个更友好的 .NET 方法来包装它:

最近我将签名更改为在 DLLImport 属性中包含“BestFitMapping = false, ThrowOnUnmappableChar = true”以符合 FxCop 的建议。这是一个红鲱鱼,我将在后面描述。

我期望做出此更改的是对 Unicode 的有限支持。例如,在具有英文代码页的机器上,如果您传递包含日文字符的字符串,则会引发异常。在日文机器上,我希望能够将日文字符串传递给函数。英语测试按预期工作,但日语测试抛出 System.Runtime.InteropServices.COMException,HRESULT 为 0x8007007A。即使没有 BestFitMapping 和 ThrowOnUnmappableChar 设置,也会发生这种情况。

我环顾四周,看到一些网站建议您只需指定普通参数即可 PInvoke varargs,所以我尝试了这个签名:

当我在英语或日语机器上使用它时,这会引发 AccessViolationException。

我不能使用 UTF-8 或其他 Unicode 编码,因为这个 C 库只需要并处理多字节 ANSI。我发现为这个函数指定 CharSet.Unicode 是可行的,但我担心这只是巧合,而不是我应该依赖的东西。我曾考虑使用系统代码页将字符串转换为 byte[],但不知道如何指定我想将字节数组传递给 varargs 参数。

这是怎么回事?在英文机器上,英文字符工作正常,日文字符按预期抛出 ArgumentException。在日文机器上,英文字符工作正常,日文字符抛出 COMException。我的 PInvoke 签名有问题吗?我尝试使用该MarshalAs属性来指定 LPArray 的类型和 LPStr 的子类型,但这同样失败。UnmanagedType.LPStr 表示它是一个单字节的 ANSI 字符串;有没有办法指定多字节 ANSI 字符串?

** 更新 ** 这是考虑到当前评论的补充内容。

如果我指定 CDecl 的调用约定并采用如下普通参数:

当我使用这个规范时,我得到一个 AccessViolationException。所以我尝试了这个:

这适用于英语并在我使用日语字符时抛出 COMException。

我发现唯一能始终如一地工作的是:

为了完成这项工作,我使用 Marshal.StringToHGlobalAnsi() 并传递该指针。这适用于英语和日语。我对不理解为什么这是解决方案感到不舒服,但它确实有效。

0 投票
2 回答
2321 浏览

c++ - C++ 函数指针问题

由于某种原因,试图将指向该函数的指针传递给可变参数函数会产生以下错误:

我不确定问题是什么,因为模板函数没有过载,并且模板参数是明确定义的,所以对于哪个函数传递指针是毫无疑问的......

有没有办法解决这个问题,不会为每个参数转换函数创建很多版本,但如果出现错误,仍然可以在异常中包含参数编号?(更好的方法是将参数编号作为参数传递,因此我的 dll 中没有该函数的多个副本。)

编辑:这似乎也导致编译错误。有没有办法创建指向模板函数的函数指针,还是我需要与普通函数不同?

该函数声明为:

EDIT2:添加运营商的地址又给出了另一个不同的错误......

0 投票
6 回答
6257 浏览

c - 用 C 语言生成宏?

我想让C预处理器为我生成宏(即,我只使用 C99)。我会写一个宏

当我把

稍后在代码中,它将扩展为

然后我就可以使用 name1 和 name2 作为(宏实现的)函数。我认为我在两个步骤中都使用宏:使用宏重复重新填充模板是有意义的,并且可变参数处理除了通过宏之外将不起作用。

那么,<...magic here...> 占位符中包含什么来执行此操作?在这一点上,我开始相信这在 C99 中是不可能的,但也许我遗漏了一些语法细节。

0 投票
5 回答
14738 浏览

ruby - Ruby Function with Unlimited Number of Parameters

How do I create a Ruby function that does not have an explicit number of parameters?

More clarification needed?

0 投票
2 回答
141 浏览

c++ - 从单独的库调用 swprint 失败

我面临一个奇怪的问题。我根据构建定义使用 sprintf 或 swprintf 是否有 unicode。我已经将这些函数包装在我自己的函数中,如下所示:

这些函数位于 String 类中,该类是一个单独的项目,并被编译为 lib。我在另一个程序中使用它。现在如果我使用 mysprintf()

我在字符串缓冲区中得到了一些垃圾值。但是,如果我直接从程序中调用 swprintf 函数,它就可以正常工作。我在构建中定义了 UNICODE,并且确实调用了函数 swprintf,但它填充了一些垃圾值。我不明白出了什么问题。

谢谢阿米特

0 投票
1 回答
837 浏览

visual-c++ - 我应该将 CString 传递给 Format/printf (以及一般的可变参数)吗?

我最近接了一个小型的MCF C++应用程序,它显然处于工作状态。首先,我在代码上运行 PC-Lint,而 lint 抱怨 CStringT 正在传递给 Format。互联网上的意见似乎存在分歧。有人说 CSting 旨在无错误地处理这个用例,但其他人(以及MSDN 文章)说它应该在传递给可变参数函数时始终被强制转换。Stackoverflow 可以就这个问题达成任何共识吗?

0 投票
2 回答
859 浏览

java - 在 Java 中,给定 2 个可变参数方法 foo(int...ints) 和 foo(Object...objects),为什么调用 foo() 没有歧义?

如果我只声明 2 个可变参数方法,如下所示:

然后有代码:

由于预期的歧义,这是一个编译器错误。

但是,如果我只有以下 2 个版本的 foo:

然后代码

调用方法的 ints 版本。谁能解释为什么第二个示例不是同样模棱两可,以及为什么它解析为 int 方法而不是 Object 方法。谢谢。

0 投票
3 回答
4702 浏览

c# - 使用可变数量的 printf 样式参数记录一条消息

我正在尝试实现一个 C# 方法,该方法可以使用格式字符串和可变数量的 printf 样式参数记录消息。理想情况下,它的工作方式与我在下面粘贴的 C 函数相同,当然对于 C# 来说是惯用的。

这个函数对我来说很方便,因为它允许我进行以下调用: