2014-03-14 42 views
1

我有以下宏:为什么在使用__VA_ARGS__从宏调用函数时“vsprintf”卡住了?

#define TRACE__LOW(str, col, ...)\ 
     TR_Trace("\r\e[" COLOR(col) "%s :: %s():%d; LOW - " str "\e[0m\r\n",\ 
     ##__VA_ARGS__); 

而且功能TR_Trace看起来是这样的:

void TR_Trace(const char *const string, ...) 
{ 
    va_list aptr; 
    size_t stringSize = 0; 
    char tempString[250]; 

    va_start(aptr, string); 
    vsprintf(tempString, string, aptr); 
    va_end(aptr); 
} 

而我使用它是这样的:

TRACE__LOW("Led[%d] toggled every %d milliseconds (%5d)", GREEN 
      init_parameters.led, delay_time, counter++); 

问题这里是一旦执行到vsprintf(tempString,string,aptr);它卡在那里。

是否有人知道发生了什么,或者如果我没有正确使用这个VA_ARGS

问候。

+0

你是什么意思 “卡住” 是什么意思?另外,你的意思是使用'vprintf()'而不是'vsprintf()'? – augurar

+0

你不应该在'__VA_ARGS__'之前使用'##';你不会将它粘贴到另一个字符串上。什么是'绿色',它应该是'绿色',?否则我不明白这一行。 –

+1

@MattMcNabb ## __ VA_ARGS__是已知的扩展名,当__VA_ARGS__为空时可以去掉','符号。它实际上是正确的(但非标准)。 – keltar

回答

4

您将%s :: %s():%d;添加到格式字符串,但不要添加额外的参数来填充这些模式。

我想它的意思是

#define TRACE__LOW(str, col, ...)\ 
     TR_Trace("\r\e[" COLOR(col) "%s :: %s():%d; LOW - " str "\e[0m\r\n",\ 
     __FILE__, __func__, __LINE__,\ 
     ##__VA_ARGS__); 
+0

你是对的!当我修改宏以添加__VA_ARGS__时,我擦除了“__FILE__,__func__,__LINE__”参数,这是问题所在。 – m4l490n

0

随想:

您使用的__VA_ARGS__似乎是正确的。

TRACE__LOW宏在输出中添加了一个多余的分号(可能会导致没有大括号的条件语句出现问题)。

我不知道COLOR(GREEN)扩展到,所以这可能是问题的根源。

建议:

你的编译器应该有一个选项输出从预处理的结果。在编译器中,我使用的是-E。如果你有编译器输出预处理器的结果,你可以精确地看到你的宏扩展到了什么地方。

例如,编译下面的代码与-E

#include <stdio.h> 

#define TRACE__LOW(str, col, ...)\ 
TR_Trace("\r\e[" COLOR(col) "%s :: %s():%d; LOW - " str "\e[0m\r\n",\ 
##__VA_ARGS__); 

int main(void) 
{ 
    TRACE__LOW("test", 3, a, b, c); 
} 

,输出结果(后约500万其他线路;))

int main(void) 
{ 
    TR_Trace("\r\e[" COLOR(3) "%s :: %s():%d; LOW - " "test" "\e[0m\r\n", a, b, c);; 
}