【问题标题】:Why "vsprintf" is getting stuck when calling a function from a macro using __VA_ARGS__?为什么在使用 __VA_ARGS__ 从宏调用函数时“vsprintf”会卡住?
【发布时间】:2014-03-14 03:31:00
【问题描述】:

我有以下宏:

#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

问候。

【问题讨论】:

  • “卡住”是什么意思?另外,您的意思是使用vprintf() 而不是vsprintf()
  • 你不应该在__VA_ARGS__之前使用##;您没有将其粘贴到另一个字符串上。什么是GREEN,它应该是GREEN, 吗?否则我不明白那行。
  • @MattMcNabb ##__VA_ARGS__ 是在 VA_ARGS 为空时摆脱 , 符号的已知扩展。它实际上是正确的(但不标准)。

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


【解决方案1】:

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

【讨论】:

  • 你是对的!当我修改宏以添加 VA_ARGS 时,我删除了“FILEfuncLINE”参数,所以这就是问题所在。
【解决方案2】:

随意的想法:

您对__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);;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 2021-12-21
    • 2019-11-23
    相关资源
    最近更新 更多