2014-04-01 38 views
1

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

因为我希望我的C文件尽可能通用,所以我有静态变量,它包含指向较高代码中可能的回调的指针,并在init调用中填充。由于指针可能为空,如果较高的代码不感兴趣,我通常会有一个本地包装,只有通过指针调用,如果它不是null。但是我很难找出如何转发这个由'...'表示的模糊事物,并且只是在参数列表中用'...'调用该函数会给出语法错误。

有没有办法做到这一点,或者我坚持有一个虚拟的本地处理程序,并有初始化设置null回调到一个指针?

+0

我不明白究竟你的意思。你能提供一个或两个例子吗? – glglgl

+0

以调试为例,大多数是单独的文本,'DebugMessage(“无论什么特定的错误”),但有些你可能想添加额外的信息 - 最简单的是一些简单变量的值。现在你可以使用printf并分配一个字符串缓冲区,填充它并发送回去,但这比'DebugMessage(“在测试点%d失败; var1 =%d,var2 =%d”,23,a ,b)'因为DebugMessage可能在嵌入式平台(输出到串口)上执行不同的操作,而不是在基于GUI的桌面PC上执行(弹出一个对话框),您希望它在更高级别上运行。更清晰? –

+0

部分,是的。你可以很高兴地为此创建一个可变参数函数。但是一定要记得提供一个采用'va_list'并且由其他人调用的版本。在那里有作者“忘记”他们的图书馆,并且扩展它们是一个真正的PITA。 – glglgl

回答

2

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

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

same FAQs,所以一般建议有一个(或大部分)版本服用va_list每一个参数可变型函数