【问题标题】:Give variable parameter list to a called function in C [duplicate]将可变参数列表提供给C中的被调用函数[重复]
【发布时间】:2021-11-29 20:03:44
【问题描述】:

我有一个带有类似 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);
但找不到如何使用它。

如何将可变参数列表提供给被调用函数?

【问题讨论】:

  • 该帖子的答案的关键部分:“您不能将可变参数传递给可变参数函数。相反,您必须调用一个以 va_list 作为参数的函数。"

标签: c parameter-passing


【解决方案1】:

您需要重写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*);

【讨论】:

  • 感谢您的解决方案 :) char char *FmtStr 没有错字吗?不应该是const char *FmtStr吗?
猜你喜欢
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
相关资源
最近更新 更多