如何包装具有可变长度参数的函数?

新手上路,请多包涵

我希望在 C/C++ 中做到这一点。我遇到了 Variable Length Arguments ,但这建议使用 Python 和 C 使用 libffi 的解决方案。

现在,如果我想用 myprintf 包装 printf 函数。

我这样做如下:

 void myprintf(char* fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    printf(fmt, args);
    va_end(args);
}

int _tmain(int argc, _TCHAR* argv[])
{
    int a = 9;
    int b = 10;
    char v = 'C';
    myprintf("This is a number: %d and \nthis is a character: %c and \n another number: %d\n", a, v, b);
    return 0;
}

但结果并不如预期!

 This is a number: 1244780 and
this is a character: h and
another number: 29953463

我错过了什么?

原文由 prakash 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 615
2 个回答

问题是您不能将 ‘printf’ 与 _vaargs 一起使用。如果您使用可变参数列表,则必须使用 vprintfvprintvsprintfvfprintf 等(微软的 C 运行时中也有“安全”版本,可以防止缓冲区溢出等)

您的示例工作如下:

 void myprintf(char* fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    vprintf(fmt, args);
    va_end(args);
}

int _tmain(int argc, _TCHAR* argv[])
{
    int a = 9;
    int b = 10;
    char v = 'C';
    myprintf("This is a number: %d and \nthis is a character: %c and \n another number: %d\n", a, v, b);
    return 0;
}

原文由 Mark 发布,翻译遵循 CC BY-SA 4.0 许可协议

我也不确定你所说的纯是什么意思。

在 C++ 中,我们使用:

 #include <cstdarg>
#include <cstdio>

class Foo
{
    void Write(const char* pMsg, ...);
};

void Foo::Write( const char* pMsg, ...)
{
    char buffer[4096];
    std::va_list arg;
    va_start(arg, pMsg);
    std::vsnprintf(buffer, 4096, pMsg, arg);
    va_end(arg);
    ...
}

原文由 David Sykes 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题