当前位置:  开发笔记 > 编程语言 > 正文

如何用可变长度参数包装函数?

如何解决《如何用可变长度参数包装函数?》经验,为你挑选了3个好方法。

我希望用C/C++做到这一点.

我遇到了可变长度参数,但这表明使用libffi的 Python和C解决方案.

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

我的工作如下:

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

我错过的任何一点?



1> Mark..:

问题是你不能将'printf'与va_args一起使用.如果使用可变参数列表,则必须使用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;
}



2> Shafik Yaghm..:

在C++ 11中,这是一种可能的解决方案Variadic templates:

template
void myprintf(const char* fmt, Args... args )
{
    std::printf( fmt, args... ) ;
}

编辑

正如@rubenvb指出需要考虑的权衡,例如,您将为每个实例生成代码,这将导致代码膨胀.



3> David Sykes..:

我也不确定你的意思是纯粹的

在C++中我们使用

#include 
#include 

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);
    ...
}

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有