将可变参数列表提供给 C 中的被调用函数
Give variable parameter list to a called function in C
我有一个带有类似 printf 的变量参数列表的函数,我调用它的示例是:
debugMsg(__FILE__, __LINE__, "failed with var %s = %d\n", var, val);
现在我需要一个包装函数,例如:
void debugMsgWrapper(const char* FileName, int LineNo, const char* FmtStr, ...)
{
// do some other things
DebugMsg(FileName, LineNo, FmtStr, ...);
}
当然,这不适用于指定为 ...
的参数列表,但我不知道如何将参数列表复制到被调用函数。我看过
void va_copy(va_list dest, va_list src);
但找不到如何使用它。
如何将可变参数列表传递给被调用函数?
您需要重写 debugMsg
以便它采用 va_list
而不是可变数量的参数。以下是您的操作方式:
void
debugMsg(const char *FileName, int LineNo, const char *FmtStr, va_list args);
void
debugMsgWrapper(const char *FileName, int LineNo, const char *FmtStr, ...)
{
va_list args;
// do some other things
va_start(args, FmtStr); // Make args start after FmtStr;
debugMsg(FileName, LineNo, FmtStr, args);
va_end(args);
}
然后,您可以在 debugMsg
中通过 va_arg
:
重复从 args
中提取参数
int n;
const char *string;
n = va_arg(args, int);
string = va_args(args, char*);
我有一个带有类似 printf 的变量参数列表的函数,我调用它的示例是:
debugMsg(__FILE__, __LINE__, "failed with var %s = %d\n", var, val);
现在我需要一个包装函数,例如:
void debugMsgWrapper(const char* FileName, int LineNo, const char* FmtStr, ...)
{
// do some other things
DebugMsg(FileName, LineNo, FmtStr, ...);
}
当然,这不适用于指定为 ...
的参数列表,但我不知道如何将参数列表复制到被调用函数。我看过
void va_copy(va_list dest, va_list src);
但找不到如何使用它。
如何将可变参数列表传递给被调用函数?
您需要重写 debugMsg
以便它采用 va_list
而不是可变数量的参数。以下是您的操作方式:
void
debugMsg(const char *FileName, int LineNo, const char *FmtStr, va_list args);
void
debugMsgWrapper(const char *FileName, int LineNo, const char *FmtStr, ...)
{
va_list args;
// do some other things
va_start(args, FmtStr); // Make args start after FmtStr;
debugMsg(FileName, LineNo, FmtStr, args);
va_end(args);
}
然后,您可以在 debugMsg
中通过 va_arg
:
args
中提取参数
int n;
const char *string;
n = va_arg(args, int);
string = va_args(args, char*);