是否可以将两个具有不同签名的函数作为参数传递给另一个函数?

尼基尔

目前,我具有以下2个功能:

void write_to_file(FILE *fp)
{
    fprintf(fp, "stuff here: %d", 10);
    /* 1000s of similar lines below */
}

void write_to_string(char *str)
{
    sprintf(str, "stuff here: %d", 10);
    /* 1000s of similar lines below */
}

我想将其多边形变形为单个函数。我曾想过类似的事情:

void write_somewhere(void *ptr, int to_file)
{
    if (to_file) {
        typedef fprintf myprintf;
    } else {
        typedef sprintf myprintf;
    }
    myprintf(ptr, "stuff here: %d", 10);
}

这行不通,看起来很丑。

由于签名fprintfsprintf是不同的,如下,

int fprintf(FILE *stream, const char *format, …);
int sprintf(char *buffer, const char *format, …);

是否可以做类似的事情,

void write_somewhere(void *ptr, void *func)
{
    func(ptr, "stuff here: %d", 10);
}

编辑:基于下面的Alter回答,这是我所拥有的,但是它并没有按预期工作,并且在尝试在write_somewhere()函数中打印出值时会打印出垃圾值:

#include <stdio.h>
#include <stdarg.h>

typedef int (*myprintf_t) (void *, const char *, ...);

int myfprintf(void *ptr, const char *format, ...)
{
    va_list args;
    int ret;

    va_start(args, format);
    ret = vfprintf(ptr, format, args);
    va_end(args);
    return ret;
}

int mysprintf(void *ptr, const char *format, ...)
{
    va_list args;
    int ret;

    va_start(args, format);
    ret = vsprintf(ptr, format, args);
    va_end(args);
    return ret;
}

void write_somewhere(void *ptr, myprintf_t myprintf, const char *format, ...)
{
    va_list args;
    int ret;

    va_start(args, format);
    ret = myprintf(ptr, format, args);
    va_end(args);
    return ret;
}

int main(void)
{
    char s[100];
    int i = 100;

    /* This works */
    write_somewhere(stdout, myprintf, "Hello world");

    /* This prints out garbage */
    write_somewhere(stdout, myprintf, "Hello world, I am %d", i);
    write_somewhere(s, mysprintf);
    return 0;
}
大卫·拉涅里(David Ranieri)

仁的答案是正确的,但是在这种情况下,您可以重定向ptrv*printf使用函数指针:

#include <stdio.h>
#include <stdarg.h>

int myfprintf(void *ptr, const char *format, ...)
{
    va_list args;
    int ret;

    va_start(args, format);
    ret = vfprintf(ptr, format, args);
    va_end(args);
    return ret;
}

int mysprintf(void *ptr, const char *format, ...)
{
    va_list args;
    int ret;

    va_start(args, format);
    ret = vsprintf(ptr, format, args);
    va_end(args);
    return ret;
}

void write_somewhere(void *ptr, int (*myprintf)(void *, const char *, ...))
{
    myprintf(ptr, "stuff here");
}

int main(void)
{
    char s[100];

    write_somewhere(stdout, myfprintf);
    write_somewhere(s, mysprintf);
    return 0;
}

最后修改:

看来您想将一些Extras参数传递给write_somewhere,在这种情况下,我建议:

#include <stdio.h>
#include <stdarg.h>

#define TO_FILE 0
#define TO_STRING 1

void write_somewhere(int where, void *ptr, const char *format, ...)
{
    #define myprintf(ptr, ...) \
    (where == TO_FILE ? vfprintf(ptr, __VA_ARGS__) : vsprintf(ptr, __VA_ARGS__))

    va_list args;
    va_start(args, format);
    myprintf(ptr, format, args);
    /* more stuff */
    va_end(args);
    #undef myprintf
}

int main(void)
{
    char s[100];

    write_somewhere(TO_FILE, stdout, "%u\n", 10);
    write_somewhere(TO_STRING, s, "Hello");
    printf("%s\n", s);
    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将具有不同数量参数的函数传递给另一个函数C ++

来自分类Dev

将具有任意数量参数的任何函数传递给另一个函数

来自分类Dev

我可以将一个函数和不同数量的参数传递给另一个函数吗?

来自分类Dev

将函数参数作为参数传递给python中的另一个函数

来自分类Dev

如何将参数传递给作为另一个函数参数的函数

来自分类Dev

将匿名函数作为唯一参数传递给另一个函数(C ++)

来自分类Dev

在Lua中是否可以将参数绑定到作为参数传递给另一个函数的回调函数?(JavaScript的“绑定”等效项)

来自分类Dev

我可以将函数调用作为参数传递给另一个函数吗?Python

来自分类Dev

将函数输出作为参数传递给另一个函数

来自分类Dev

将匿名多行函数作为参数传递给另一个函数

来自分类Dev

如何将tanh函数作为参数传递给另一个函数?

来自分类Dev

将模板化函数作为参数传递给另一个函数

来自分类Dev

将函数返回作为参数传递给另一个函数

来自分类Dev

将匿名多行函数作为参数传递给另一个函数

来自分类Dev

如何将函数作为参数传递给另一个函数?

来自分类Dev

如何将泛型函数作为参数传递给另一个函数?

来自分类Dev

将函数作为参数传递给另一个函数错误

来自分类Dev

如何传递具有参数作为另一个函数的参数的函数指针?

来自分类Dev

我可以将一个函数传递给另一个函数,该函数调用具有依赖性的函数吗?

来自分类Dev

将open调用作为参数传递给另一个函数后,文件对象是否关闭?

来自分类Dev

如何将一个函数作为参数传递给另一个函数

来自分类Dev

R-如何将一个函数作为参数传递给另一个函数?

来自分类Dev

将范围内的枚举作为函数参数传递给另一个

来自分类Dev

将数组变量作为参数传递给另一个函数

来自分类Dev

是否可以将一个属性值作为参数传递给通过函数计算其值的另一个属性?(在带有类的Javascript ES6中)

来自分类Dev

将一个函数的参数传递给另一个函数?

来自分类Dev

将一个函数传递给另一个函数的参数

来自分类Dev

如何将参数传递给另一个具有相同名称的内部函数?

来自分类Dev

将带有自动参数的 lambda 传递给另一个函数是否合法

Related 相关文章

  1. 1

    将具有不同数量参数的函数传递给另一个函数C ++

  2. 2

    将具有任意数量参数的任何函数传递给另一个函数

  3. 3

    我可以将一个函数和不同数量的参数传递给另一个函数吗?

  4. 4

    将函数参数作为参数传递给python中的另一个函数

  5. 5

    如何将参数传递给作为另一个函数参数的函数

  6. 6

    将匿名函数作为唯一参数传递给另一个函数(C ++)

  7. 7

    在Lua中是否可以将参数绑定到作为参数传递给另一个函数的回调函数?(JavaScript的“绑定”等效项)

  8. 8

    我可以将函数调用作为参数传递给另一个函数吗?Python

  9. 9

    将函数输出作为参数传递给另一个函数

  10. 10

    将匿名多行函数作为参数传递给另一个函数

  11. 11

    如何将tanh函数作为参数传递给另一个函数?

  12. 12

    将模板化函数作为参数传递给另一个函数

  13. 13

    将函数返回作为参数传递给另一个函数

  14. 14

    将匿名多行函数作为参数传递给另一个函数

  15. 15

    如何将函数作为参数传递给另一个函数?

  16. 16

    如何将泛型函数作为参数传递给另一个函数?

  17. 17

    将函数作为参数传递给另一个函数错误

  18. 18

    如何传递具有参数作为另一个函数的参数的函数指针?

  19. 19

    我可以将一个函数传递给另一个函数,该函数调用具有依赖性的函数吗?

  20. 20

    将open调用作为参数传递给另一个函数后,文件对象是否关闭?

  21. 21

    如何将一个函数作为参数传递给另一个函数

  22. 22

    R-如何将一个函数作为参数传递给另一个函数?

  23. 23

    将范围内的枚举作为函数参数传递给另一个

  24. 24

    将数组变量作为参数传递给另一个函数

  25. 25

    是否可以将一个属性值作为参数传递给通过函数计算其值的另一个属性?(在带有类的Javascript ES6中)

  26. 26

    将一个函数的参数传递给另一个函数?

  27. 27

    将一个函数传递给另一个函数的参数

  28. 28

    如何将参数传递给另一个具有相同名称的内部函数?

  29. 29

    将带有自动参数的 lambda 传递给另一个函数是否合法

热门标签

归档