【问题标题】:First argument is wrong when passing __VA_ARGS__传递 __VA_ARGS__ 时第一个参数是错误的
【发布时间】:2017-08-17 14:30:06
【问题描述】:

我正在尝试将 __ VA_ARGS __ 传递给函数。由于某种原因,第一个参数总是错误的(看起来像一个地址):

#define PRINTF_ERROR(format, ...)  {\
        PrintfError(format, __FUNCTION__, ##__VA_ARGS__);\
}

void PrintfError(const char* format, const char* function, ...)
{
    va_list args;
    va_start(args, format);
    printf("%s(): ", function);
    printf(format, args);
    va_end(args);
} 

例如,当尝试打印相同的变量时: "A = 0x20005524 A = 0x00000007"

有人知道为什么吗? 谢谢

【问题讨论】:

  • printf 没有va_list——你可能是指vprintf

标签: c macros variadic-functions


【解决方案1】:

这里有两个问题。

首先,va_start 期望当前函数的最后一个命名参数作为其第二个参数。在本例中为function

第二个问题是您将va_list 传递给printf。你应该打电话给vprintf

void PrintfError(const char* format, const char* function, ...)
{
    va_list args;
    va_start(args, function);   // pass "function" instead of "format"
    printf("%s(): ", function);
    vprintf(format, args);      // call vprintf
    va_end(args);
} 

【讨论】:

    【解决方案2】:

    您的参数顺序错误。您传递给va_start() 的那个必须是... 之前的那个,因为它用于计算额外参数的开始位置

    所以你的函数应该是这样的......

    void PrintfError(const char* function, const char* format, ...)
    {
        va_list args;
        va_start(args, format);
    

    【讨论】:

      【解决方案3】:

      来自man va_start

      void va_start(va_list ap, last);
      

      [...]

      描述

      va_start()
      

      [...] 参数last是变量参数列表前最后一个参数的名称,即调用函数知道其类型的最后一个参数。

      给定

      void PrintfError(const char* format, const char* function, ...)
      

      只是改变

        va_start(args, format);
      

      成为

        va_start(args, function);
      

      还有这个

        printf(format, args);
      

      (可能是错字)应该是

        vprintf(format, args);
      

      与你的问题无关,在这里

      #define PRINTF_ERROR(format, ...)  {\
          PrintfError(format, __FUNCTION__, ##__VA_ARGS__);\
      }
      

      花括号只是确保安全的一半。

      做得更好

      #define PRINTF_ERROR(format, ...)  do {\
          PrintfError(format, __FUNCTION__, __VA_ARGS__);\
      } while (0)
      

      也不需要##

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-21
        • 2020-05-25
        • 1970-01-01
        • 2014-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-05
        相关资源
        最近更新 更多