2012-10-18 50 views
1

最近我想实现一个printf包装器。一些搜索后,我发现了vprintf有利于这方面的需要:在C中带有可变参数的函数的包装器

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

但它是可以实现的printf或可变参数,而不是va_list任何其他类似的功能,例如一个包装?

(我的意思是,如果他们不提供什么v版本?)


由于一些评论者没有完全抓住了我的想法,我最好阐述它。

假设您有一个普通的printf函数,就像在C库中一样。

有人给你一个fmt字符串"%d %u %f"和相应的输入。

现在你想写一个类似于printf的函数,但是所有的%f都被%.2f所取代。

当然你也可以用两个语句来完成这个任务:

replace(fmt, "%f", "%.2f"); 
printf(fmt, inputs); 

但是如果你使用这个功能很多次,也许你想有一个包装,以节省一些时间。

当然,宏可以完成这个任务。但是,它可能没有一个宏,如:

void myprintf(fmt, ...) 
{ 
    replace(fmt, "%f", "%.2f"); 
    printf(fmt, inputs); 
} 

这里的问题是,你不知道如何与参数的myprintf...饲料内printf

希望澄清。

+0

我不明白你真正想要什么。你是否想要变量参数而不必使用'va_list'? – Pablo

回答

3

如果你只是想用它来在输出前加一个字符串,你可以使用可变宏。

#define MYPRINT(...) printf("toto has: " __VA_ARGS__) 
在简单的例子

这suppposes你传递是一个字符串文字是格式,所以这是一个有点限制。但我希望你看到这个模式如何使用这种简单的宏包装。

2

当API不提供参数为va_list函数时,没有可移植的方式来构建对可变参数函数的调用。

但是,您可以[ab]使用libffi来实现此目的,方法是构建可变参数调用并执行此操作。