2010-01-13 45 views
22

可能重复:
C Programming: Forward variable argument list.是否有可能编写一个可变参数列表函数将参数列表发送给另一个可变参数函数?

我想要做的是将数据发送到一个日志库(我不能modfify)在一个printf的一种方式。

所以我想一个函数是这样的:

void log_DEBUG(const char* fmt, ...) { 
    char buff[SOME_PROPER_LENGTH]; 
    sprintf(buff, fmt, <varargs>); 
    log(DEBUG, buff); 
} 

我可以通过可变参数到另一个可变参数的功能以某种方式?

+1

杜佩:http://stackoverflow.com/questions/1719784/c-programming-forward-variable-argument-list – 2010-01-13 21:59:17

回答

25

您无法转发变量参数列表,因为无法将...下面的内容作为参数表达到另一个函数。

但是你可以建立从...参数va_list和发送到将正确地格式化它的功能。这是vsprintf的用途。例如:

void log_DEBUG(const char* fmt, ...) { 
    char buff[SOME_PROPER_LENGTH]; 
    va_list args; 
    va_start(args, fmt); 
    vsprintf(buff, fmt, args); 
    va_end(args); 
    log(DEBUG, buff); 
} 
+1

别忘了** va_end ** – 2010-01-13 22:15:18

+0

@Nikolai N Fetissov:谢谢,修正。 – 2010-01-13 22:18:22

+3

我在这里没有看到任何非标准的东西。 – 2010-01-13 22:26:03

3

不是标准的C++。

+0

右,在C++中这将是优选使用''<<究竟 – ezpz 2010-01-13 22:20:01

7

这就是为什么你有vprintf功能家族。

4

根据您的具体要求,您可以使用vsprintf。我的C/C++太生锈了,以至于当另一个函数不是为它设计的时候,是否有一种简单的方法可以实现它(没有进入难看的堆栈操作),但我倾向于认为不是。

13

您可以将它发送到以va_list作为参数的另一个函数。除此之外,没有其他办法了,只能用手工制作asm,或者做一些可怕的猜谜游戏来找出参数的“数量”。

这会工作:

void log_DEBUG(const char* fmt, ...) 
{ 
    va_list va; 
    va_start(va,fmt); 
    char buff[blah]; 
    vsprintf(buff,fmt,va); 
    log(DEBUG,buff); 
    va_end(va); 
} 

基本上,只要你写一个函数,......,你应该写另一个版本,需要的va_list - 如果要启用这个了礼貌的事类型的链接调用。

+0

我需要什么。我想也许有人直接通过arg列表,但vsprintf会做得很好! – 2010-01-13 22:03:00

+0

接受的答案错过了“vsprintf”点,这就是为什么许多人(包括我)会谷歌这个答案。 – perfectionist 2013-09-16 13:49:30

相关问题