问题标签 [variadic]
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 - 在 C 中转发可变参数函数的调用
在 C 中,是否可以转发可变参数函数的调用?如中,
在这种情况下,以上述方式转发调用显然不是绝对必要的(因为您可以以其他方式记录调用,或使用 vfprintf),但我正在处理的代码库需要包装器做一些实际工作,并且不'没有(也不能添加)类似于 vfprintf 的辅助函数。
[更新:根据迄今为止提供的答案,似乎有些混乱。用另一种方式来表达这个问题:一般来说,你可以包装一些任意可变参数函数而不修改该函数的定义。]
c - 如何制作可变参数宏(可变数量的参数)
我想用 C 编写一个宏,它接受任意数量的参数,而不是特定的数字
例子:
其中X
是任意数量的参数
我需要这个,因为whatever
它重载并且可以用 2 或 4 个参数调用。
我尝试定义宏两次,但第二个定义覆盖了第一个!
我正在使用的编译器是 g++(更具体地说,mingw)
c - 基于格式字符串的智能可变参数扩展
我有一个读取配置文件的守护程序,以便知道在哪里写东西。在配置文件中,存在这样的一行:
或者,它可能看起来像这样:
...或者只是这样:
...或者最后:
我在我的程序中将该行作为 cfg->pathfmt 。我现在要做的是想出一些巧妙的使用方法。
再解释一下,路径最多可以包含两个要格式化的组件。%d 将扩展为作业 ID (int),%s 将扩展为作业名称(字符串)。用户可能希望在配置文件中使用一个、两个或一个都不使用。在我最终将其传递给 snprintf() 之前,我需要知道他们想要什么以及按什么顺序。我可以缩小范围,但我一直想与 strtok() 交谈,这看起来很难看。
我想给用户这种灵活性,但是我迷失了寻找一种明智的、可移植的方式来实现它。我也完全不知道如何开始搜索这个。
如果出现以下情况,我会非常高兴:
- 有人可以帮我缩小搜索词组的范围以找到好的例子
- 有人可以发布一个链接到一些实现这个的 OSS 项目
- 有人可以发布一些伪代码
我不想要为我编写的代码,我只是真的坚持(我认为)应该是非常简单的东西,并且需要一些帮助才能吃第一口。我真的觉得我想多了,忽略了显而易见的事情。
最终结果应该是这样的布尔函数:
然后它将在 j->outpath 上调用 snprintf()(明智地),如果某种垃圾(即 % 后跟不是 s、d 或 % 的东西)在配置行中(或其 null),则返回 false。健全性检查很容易,我只是花一点时间来获取参数的数量(和顺序)以正确格式化。
提前致谢。另外,如果您有声誉,请随时编辑此标题,正如我所说,我不太确定如何在一行中提出问题。我认为我需要的是一个解析器,但是使用成熟的词法分析器/解析器来处理一个简单的字符串感觉很尴尬。
c# - 需要数组的可变参数函数的设计决策是什么?
我很好奇,希望有人能对此有所了解——但为什么采用“参数”的 C# 函数必须是一个数组?
我知道参数列表中的对象被输入了一个数组,但是如果有人想要创建一个可变参数函数来接收未定义数量的数组对象怎么办?
以这个函数为例...
很简单,它可以接受不同数量的数字 - 例如......
现在假设我想创建一个函数,它接收不同数量的整数数组并对所有数字求和。据我所知,我将不得不考虑拳击......
然后可以像...一样使用
这背后的原因是什么?为什么这不是作为一个单一的非数组变量实现的?比如params Int32
?
c - 将参数动态传递给可变参数函数
我想知道是否有任何方法可以动态地将参数传递给可变参数函数。即如果我有一个功能
我正在接受来自用户的一堆值,我想要某种方式将这些值传递给函数:
我不想编写所有这些函数的不同版本,但我怀疑没有其他选择?
c - 是否可以迭代可变参数宏中的参数?
我想知道是否可以迭代传递给 C99 中的可变参数宏或使用任何 GCC 扩展的参数?
例如,是否可以编写一个通用宏,将结构及其字段作为参数传递并打印结构内每个字段的偏移量?
像这样的东西:
c - 如何帮助程序员在 C 中编写安全和正确的 printf 调用?
[为清晰起见更新了组织和内容]
真正的问题
对于 C 语言来说,帮助程序员在他/她打字时编写对特定于项目的类似 printf 的调试函数的安全和正确调用的好方法是什么?
C 宏?C包装函数?代码编辑器宏或模板?其他?
背景问题和答案
许多软件使用 printf 或类似 printf 的函数进行调试,无论是在出现问题时的临时功能,还是用于调试日志。然而它很容易出错。
Q1:我们怎么知道?
A1:静态分析器有针对 printf-mismatch 错误的类别——这是一种常见的错误类别——我经常看到这些工具在 C 代码中调用这些警告。
Q2:这个错误的子类是什么?
A2:主要是格式说明符错误,格式说明符数量错误。通常真正的错误是相反的:错误的变量类型,或打印输出的变量数量错误。
Q3:我们为什么关心?
A3:充其量,导致错误的日志信息并妨碍调试。最坏的情况是软件崩溃。
Q4:有没有人尝试过解决这个问题?
A4:当然,虽然我还没有看到任何 C 语言(与 C++ 或其他语言相反),例如:
http://www.ddj.com/cpp/184401999?pgno=1 http://mi.eng.cam.ac.uk/~er258/cvd/tag/html/group__printf.html
这些产品和其他产品对我来说缺少什么,除了现在我正在研究用 C 编写的产品并且需要为 C 解决问题之外,它们是事后解决方案。他们可以避免崩溃,并且可以提供错误的警告解释,以及出了什么问题,但他们当然无法猜测程序员的意图是什么(尤其是上面的 Q&A #2)。
Q5:为什么使用 printf 这么容易出错?
A5:因为编写 printf 调用需要程序员将变量的类型和数量、格式说明符、自由文本字符串常量和标点符号(所有这些看起来非常相似)放在一行中。
c++ - 检查参数包是否包含类型
我想知道 C++0x 是否提供任何内置功能来检查可变参数模板的参数包是否包含特定类型。今天,如果您使用 boost::mpl::vector 作为可变参数模板的替代品,boost:::mpl::contains 可以用来完成此任务。但是,它具有严重的编译时间开销。我想,C++0x 对 std::is_same 有编译器级别的支持。所以我在想编译器是否也支持像下面这样的泛化。
objective-c - Objective-C 传递... nil 终止的参数列表
...
在 ObjectiveC 中存在一些问题。
我基本上是在包装一个方法,并希望接受一个nil
终止的列表并将同一个列表直接传递给我正在包装的方法。
这是我所拥有的,但它会导致EXC_BAD_ACCESS
崩溃。检查本地变量,当它被传入时,它似乎otherButtonTitles
只是一个NSString
otherButtonTitles:@"Foo", nil]
我如何简单地从传入的参数虹吸到传出的参数,保留完全相同的nil
终止列表?
c++ - 可变参数的 C++ 重载运算符逗号
是否可以通过重载参数的运算符逗号来构造函数的可变参数?我想看一个例子如何做到这一点..,也许是这样的: