c - 为什么在使用 __VA_ARGS__ 从宏调用函数时 "vsprintf"会卡住?

标签 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

问候。

最佳答案

您添加 %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__);

关于c - 为什么在使用 __VA_ARGS__ 从宏调用函数时 "vsprintf"会卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22395604/

相关文章:

c++ - 每个标记的可变宏扩展

c - 如何理解 C 语言中的#define

c - 宏中的 __VA_ARGS__ 是什么意思?

c++ - 具有以不同方式实现的可变参数构造函数的模板类 : What are the benefits and downfalls of each version?

c - 如何判断一个可选参数是否传递给函数 C

C - 调用 chmod 函数导致意外结果

c - 在 COM 嵌入式 IE 中设置 Accept-Language

c++ - 我如何在 C++ 中对包含 double 值的字符串强制执行精度

c++ - #include 指令 : relative to where?

具有 0 或 1 个参数的 C++ 宏