在C中转发对变量函数的调用

在C中转发对变量函数的调用

在C中,是否可以转发变量函数的调用?就像在,

int my_printf(char *fmt, ...) {
    fprintf(stderr, "Calling printf with fmt %s", fmt);
    return SOMEHOW_INVOKE_LIBC_PRINTF;}

在这种情况下,以上述方式转发调用显然不是必要的(因为您可以其他方式记录调用,也可以使用vfprintf),但是我正在处理的代码库要求包装器执行一些实际的工作,并且没有(也不能添加)类似于vfprintf的助手函数。

[最新情况:根据迄今提供的答案,似乎有些混乱。用另一种方式来表达这个问题:一般来说,你能把一些任意的变量函数包装起来吗?而不修改该函数的定义.]


慕森卡
浏览 458回答 3
3回答

互换的青春

不是直接的,但是,在标准库中,变量函数以成对的形式出现在标准库中是很常见的(在标准库中,这几乎是普遍的情况)。varargs风格替代功能。G.printf/vprintf那个V.。函数采用va_list参数,其实现通常使用编译器特定的“宏魔术”,但您可以保证调用v.像这样的变量函数的样式函数可以工作:#include&nbsp;<stdarg.h>int&nbsp;m_printf(char&nbsp;*fmt,&nbsp;...){ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ret; &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Declare&nbsp;a&nbsp;va_list&nbsp;type&nbsp;variable&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;va_list&nbsp;myargs; &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Initialise&nbsp;the&nbsp;va_list&nbsp;variable&nbsp;with&nbsp;the&nbsp;...&nbsp;after&nbsp;fmt&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;va_start(myargs,&nbsp;fmt); &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Forward&nbsp;the&nbsp;'...'&nbsp;to&nbsp;vprintf&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;vprintf(fmt,&nbsp;myargs); &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Clean&nbsp;up&nbsp;the&nbsp;va_list&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;va_end(myargs); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;}这应该会给你想要的效果。如果考虑编写各种库函数,还应该考虑将va_List样式的伙伴作为库的一部分。正如您可以从您的问题中看到的,它可以证明对您的用户是有用的。

忽然笑

C99支架带有各种参数的宏;根据编译器的不同,您可能可以声明一个宏来执行您想要的操作:#define&nbsp;my_printf(format,&nbsp;...)&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;{&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;"Calling&nbsp;printf&nbsp;with&nbsp;fmt&nbsp;%s\n",&nbsp;format);&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;some_other_variadac_function(format,&nbsp;##__VA_ARGS__);&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while(0)不过,一般来说,最好的解决方案是使用Va列表您试图包装的函数的形式,如果存在的话。
打开App,查看更多内容
随时随地看视频慕课网APP