问题标签 [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.
c - 将省略号传递给另一个可变参数函数
我有大约 30 个可变参数函数。每个都接受一个路径作为最后的参数,例如:
在每个函数中,我必须检查扩展格式是否小于或等于某个大小。所以,我发现自己复制/粘贴相同的代码块来检查有多少字符vsnprintf()
没有打印,errno
相应地设置并退出写入。
我想做的是编写一个函数来执行此操作,它将返回一个已知为安全大小的静态分配(扩展)字符串,或者在失败时返回新初始化的字符串,可以针对 NULL 进行检查。检查还必须确定字符串是绝对路径还是相对路径,这会影响字符串的安全大小。这是很多重复的代码,它开始闻起来了。
有没有办法可以将省略号的内容从我的函数条目传递给另一个函数?还是我必须先调用va_start()
,然后将其传递va_list
给辅助函数?
编辑:
我一点也不反对将它传递va_list
给助手,我只是想确保没有其他东西存在。在我看来,编译器理解可变参数从哪里开始,所以我只是好奇我是否可以告诉它传递它们。
java - 你什么时候在 Java 中使用可变参数?
我害怕可变参数。我不知道用它们做什么。
另外,让人们随意传递尽可能多的论点感觉很危险。
什么是使用它们的好地方的上下文示例?
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() 并传递该指针。这适用于英语和日语。我对不理解为什么这是解决方案感到不舒服,但它确实有效。
c++ - C++ 函数指针问题
由于某种原因,试图将指向该函数的指针传递给可变参数函数会产生以下错误:
我不确定问题是什么,因为模板函数没有过载,并且模板参数是明确定义的,所以对于哪个函数传递指针是毫无疑问的......
有没有办法解决这个问题,不会为每个参数转换函数创建很多版本,但如果出现错误,仍然可以在异常中包含参数编号?(更好的方法是将参数编号作为参数传递,因此我的 dll 中没有该函数的多个副本。)
编辑:这似乎也导致编译错误。有没有办法创建指向模板函数的函数指针,还是我需要与普通函数不同?
该函数声明为:
EDIT2:添加运营商的地址又给出了另一个不同的错误......
c - 用 C 语言生成宏?
我想让C预处理器为我生成宏(即,我只使用 C99)。我会写一个宏
当我把
稍后在代码中,它将扩展为
然后我就可以使用 name1 和 name2 作为(宏实现的)函数。我认为我在两个步骤中都使用宏:使用宏重复重新填充模板是有意义的,并且可变参数处理除了通过宏之外将不起作用。
那么,<...magic here...> 占位符中包含什么来执行此操作?在这一点上,我开始相信这在 C99 中是不可能的,但也许我遗漏了一些语法细节。
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?
c++ - 从单独的库调用 swprint 失败
我面临一个奇怪的问题。我根据构建定义使用 sprintf 或 swprintf 是否有 unicode。我已经将这些函数包装在我自己的函数中,如下所示:
这些函数位于 String 类中,该类是一个单独的项目,并被编译为 lib。我在另一个程序中使用它。现在如果我使用 mysprintf()
我在字符串缓冲区中得到了一些垃圾值。但是,如果我直接从程序中调用 swprintf 函数,它就可以正常工作。我在构建中定义了 UNICODE,并且确实调用了函数 swprintf,但它填充了一些垃圾值。我不明白出了什么问题。
谢谢阿米特
visual-c++ - 我应该将 CString 传递给 Format/printf (以及一般的可变参数)吗?
我最近接了一个小型的MCF C++应用程序,它显然处于工作状态。首先,我在代码上运行 PC-Lint,而 lint 抱怨 CStringT 正在传递给 Format。互联网上的意见似乎存在分歧。有人说 CSting 旨在无错误地处理这个用例,但其他人(以及MSDN 文章)说它应该在传递给可变参数函数时始终被强制转换。Stackoverflow 可以就这个问题达成任何共识吗?
java - 在 Java 中,给定 2 个可变参数方法 foo(int...ints) 和 foo(Object...objects),为什么调用 foo() 没有歧义?
如果我只声明 2 个可变参数方法,如下所示:
和
然后有代码:
由于预期的歧义,这是一个编译器错误。
但是,如果我只有以下 2 个版本的 foo:
和
然后代码
调用方法的 ints 版本。谁能解释为什么第二个示例不是同样模棱两可,以及为什么它解析为 int 方法而不是 Object 方法。谢谢。
c# - 使用可变数量的 printf 样式参数记录一条消息
我正在尝试实现一个 C# 方法,该方法可以使用格式字符串和可变数量的 printf 样式参数记录消息。理想情况下,它的工作方式与我在下面粘贴的 C 函数相同,当然对于 C# 来说是惯用的。
这个函数对我来说很方便,因为它允许我进行以下调用: