C 传递_VA_参数时,第一个参数是错误的__

C 传递_VA_参数时,第一个参数是错误的__,c,macros,variadic-functions,C,Macros,Variadic Functions,我想把参数传递给一个函数。出于某种原因,第一个参数总是错误的(似乎是地址): 例如,尝试打印同一变量时: “A=0x20005524 A=0x00000007” 有人知道为什么吗? 谢谢您的参数顺序有误。传递给va_start()的参数必须在之前,因为它用于计算额外参数的起始位置 所以你的函数应该是这样的 void PrintfError(const char* function, const char* format, ...) { va_list args; va_start

我想把参数传递给一个函数。出于某种原因,第一个参数总是错误的(似乎是地址):

例如,尝试打印同一变量时: “A=0x20005524 A=0x00000007”

有人知道为什么吗?
谢谢

您的参数顺序有误。传递给
va_start()
的参数必须在
之前,因为它用于计算额外参数的起始位置

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

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

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

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

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

这里有两个问题

首先,
va_start
期望当前函数的最后一个命名参数作为其第二个参数。在这种情况下,这将是
函数

第二个问题是将
va_列表
传递到
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);
} 

这里有两个问题

首先,
va_start
期望当前函数的最后一个命名参数作为其第二个参数。在这种情况下,这将是
函数

第二个问题是将
va_列表
传递到
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);
} 
发件人:

[……]

描述

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

如此给定

void PrintfError(const char* format, const char* function, ...)
换衣服

  va_start(args, format);
将来


还有这个

  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)
也不需要来自以下地址的
#

[……]

描述

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

如此给定

void PrintfError(const char* format, const char* function, ...)
换衣服

  va_start(args, format);
将来


还有这个

  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)

也不需要
##
printf
不需要
va\u列表
——你可能是说
vprintf
printf
不需要
va\u列表
——你可能是说
vprintf