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

我正在寻求在 C/C+npls 中做到这一点。

我遇到了 可变长度参数,但是这建议使用 库菲 使用 Python 和 C 提供服务。

现在,如果我打算用 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

我错过了什么因素?

50
2022-06-07 15:16:07
资源 分享
答案: 4

问题是您不能使用带有 va_args 的“printf”。 你需要利用 vprintf 如果您使用可变参数清单。 vprint、vsprintf、vfprintf 等(Microsoft 中也有“安全”变体是 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;
}
68
2022-06-07 17:11:58
资源

您如何暗示纯 C/C+npls 选项?

其余参数 ( ) 在 C 运行时支持跨平台。

http://msdn.microsoft.com/en-us/library/kb57fad8.aspx

1
2022-06-07 15:42:30
资源

您使用的是 C 还是 C+npls? 下一个 C+npls 变体,C+npls 0x,将支持 可变参数模板,它为该问题提供了解决方案。

另一种解决方法可以通过巧妙的运算符重载来实现,以实现如下语法:

void f(varargs va) {
    BOOST_FOREACH(varargs::iterator i, va)
        cout << *i << " ";
}

f(args = 1, 2, 3, "Hello");

为了让它工作,必须实现类 varargs 以覆盖 operator =,它返回一个代理对象,而代理对象反过来又覆盖 operator ,。 尽管如此,据我了解,在现有的 C+npls 中使这种变体类型安全是不可能的,因为它必须通过类型擦除来发挥作用。

3
2022-06-07 15:42:14
资源

我也不清楚你所说的纯

在 C+npls 我们利用

#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);
    ...
}
8
2022-06-07 15:39:08
资源