我有以下宏:
#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 :(得分: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);;
}