1

我有以下宏:

#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吗?

问候。

4

2 回答 2

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__);
于 2014-03-14T03:55:44.223 回答
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);;
}
于 2014-03-14T04:00:12.077 回答