我希望用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
我错过的任何一点?
问题是你不能将'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; }
在C++ 11中,这是一种可能的解决方案Variadic templates
:
templatevoid myprintf(const char* fmt, Args... args ) { std::printf( fmt, args... ) ; }
编辑
正如@rubenvb指出需要考虑的权衡,例如,您将为每个实例生成代码,这将导致代码膨胀.
我也不确定你的意思是纯粹的
在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); ... }