为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
肥皂起泡泡 2019-08-03 03:03:29
在C中转发对变量函数的调用在C中,是否可以转发变量函数的调用?就像在,int my_printf(char *fmt, ...) {     fprintf(stderr, "Calling printf with fmt %s", fmt);     return SOMEHOW_INVOKE_LIBC_PRINTF;}在这种情况下,以上述方式转发调用显然不是必要的(因为您可以其他方式记录调用,也可以使用vfprintf),但是我正在处理的代码库要求包装器执行一些实际的工作,并且没有(也不能添加)类似于vfprintf的助手函数。[最新情况:根据迄今提供的答案,似乎有些混乱。用另一种方式来表达这个问题:一般来说,你能把一些任意的变量函数包装起来吗?而不修改该函数的定义.]
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

不是直接的,但是,在标准库中,变量函数以成对的形式出现在标准库中是很常见的(在标准库中,这几乎是普遍的情况)。varargs风格替代功能。G.printf/vprintf

那个V.。函数采用va_list参数,其实现通常使用编译器特定的“宏魔术”,但您可以保证调用v.像这样的变量函数的样式函数可以工作:

#include <stdarg.h>int m_printf(char *fmt, ...){
    int ret;

    /* Declare a va_list type variable */
    va_list myargs;

    /* Initialise the va_list variable with the ... after fmt */

    va_start(myargs, fmt);

    /* Forward the '...' to vprintf */
    ret = vprintf(fmt, myargs);

    /* Clean up the va_list */
    va_end(myargs);

    return ret;}

这应该会给你想要的效果。

如果考虑编写各种库函数,还应该考虑将va_List样式的伙伴作为库的一部分。正如您可以从您的问题中看到的,它可以证明对您的用户是有用的。



查看完整回答
反对 回复 2019-08-04
?
郎朗坤

TA贡献1921条经验 获得超9个赞

C99支架带有各种参数的宏;根据编译器的不同,您可能可以声明一个宏来执行您想要的操作:

#define my_printf(format, ...) \    do { \
        fprintf(stderr, "Calling printf with fmt %s\n", format); \
        some_other_variadac_function(format, ##__VA_ARGS__); \
    } while(0)

不过,一般来说,最好的解决方案是使用Va列表您试图包装的函数的形式,如果存在的话。



查看完整回答
反对 回复 2019-08-04
  • 3 回答
  • 0 关注
  • 295 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信