为什么" vsprintf"使用__VA_ARGS__从宏调用函数时卡住了?

时间:2014-03-14 03:31:01

标签: c c-preprocessor variadic-functions variadic-macros

我有以下宏:

#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

问候。

2 个答案:

答案 0 :(得分: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__);

答案 1 :(得分: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);;
}