c - 传递 __VA_ARGS__ 时第一个参数是错误的

标签 c macros variadic-functions

我正在尝试将 __ 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”

有人知道为什么吗? 谢谢

最佳答案

这里有两个问题。

首先,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);
} 

关于c - 传递 __VA_ARGS__ 时第一个参数是错误的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45737917/

相关文章:

c - 将整数值赋给 C 中的字符串

c# - C 构建(从 C# 的角度)

arrays - 如何确定 C 中数组的大小?

c++ - 在可变参数模板中实现 STL 函数

java - 将可变参数作为不同类型传递给另一个方法

C程序,反转数组

c99 中 float 的编译时间/宏交换

rust - 为什么我们使用方括号而不是定义它的圆括号来调用 vec 宏?

ios - XCode 预处理器宏 #if 仍然包含与符号定义为 0 相反的代码

scheme - Typed Racket 中可变函数的类型是什么?