【问题标题】:Relaying optional arguments in a wrapper for a variadic function在可变参数函数的包装器中中继可选参数
【发布时间】:2014-04-01 10:27:14
【问题描述】:

我刚刚在 C 中发现了可变参数函数,并将一个定义为通用通知 typedef,它以及指向文本字符串的指针可以选择随其发送任何参数 - 例如,可用作通用调试函数我希望在一个地方进行所有输出字符串操作。

因为我希望我的 C 文件尽可能通用,所以我有静态变量,其中包含指向更高代码中可能的回调的指针,并填充在 init 调用中。由于如果对更高的代码不感兴趣,指针可能为空,我通常有一个本地包装器,如果它不为空,则只通过指针调用。但是我无法弄清楚如何转发这个由“...”表示的模糊事物,并且简单地在参数列表中调用带有“...”的函数会出现语法错误。

有什么方法可以做到这一点,还是我坚持使用虚拟本地处理程序并让 init 将 null 回调设置为指向它的指针?

【问题讨论】:

  • 我不明白你的意思。你能举一两个例子吗?
  • 以debug为例;大多数是单个文本,DebugMessage("whatever specific error"),但有些你可能想添加额外的信息——最简单的是一些简单变量的值。现在您可以使用 printf 并分配一个字符串缓冲区,填充它并将其发送回,但这比DebugMessage("Failure at test point %d; var1=%d, var2=%d", 23, a, b) 更痛苦,因为 DebugMessage 可能在嵌入式平台(输出到串行)上与在 GUI 上做不同的事情基于台式电脑(弹出一个对话框),您希望它在更高级别。更清晰?
  • 部分,是的。您可以愉快地为此创建一个可变参数函数。但请始终记住提供一个采用va_list 并由其他人调用的版本。那里有一些图书馆,作者“忘记”了它们,扩展它们是一个真正的 PITA。
  • 是的,我认为这是可行的方法,因为在我的情况下无论如何你都需要该功能。

标签: c variadic


【解决方案1】:

您不能传递可变参数。您必须将它们提取到 va_list 并将其传递给内部函数。

看看this Question at the C FAQ。它定义了一个想要转发到printf 的可变参数error 函数。这只是您的用例。

same FAQs 中,通常建议为每个(或大多数)可变参数函数提供一个采用va_list 的版本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2022-11-05
    相关资源
    最近更新 更多