你可以将一个带有可变数量参数的函数作为参数传递给C中的另一个函数吗?

时间:2012-03-26 05:19:09

标签: c

与[问题]相关:How do you pass a function as a parameter in C?

在C中是否可以将具有可变数量参数的函数传递给另一个函数?如果是这样,有人可以指点我一些文件或填写我吗?感谢。

5 个答案:

答案 0 :(得分:3)

您不能将(任何类型的)函数作为参数传递,但您可以将指针传递给函数(同样,几乎任何类型)。通常最简单的方法是使用typedef:

typedef int (*fptr)(char const *, ...); // e.g., match with `printf`

int apply(fptr f, char const *a, int b) { 
    return f(a, b);
}

答案 1 :(得分:3)

您可以创建一个函数指针,例如:

typedef int (*vafunc)(const char *, ...); // like printf

但是,您无法转发参数,即标准C中不存在以下内容:

void call_other(vafunc f, const char * fmt, ...)
{
    // want to say:
    // f(fmt, ...);  // How to write this???
}

GCC提供这样的匿名参数转发作为扩展,但在标准C中是不可能的。通常期望您将每个可变参数函数与v...对应物匹配,该对应物采用va_list参数,精确以此目的。 (当然可以使用固定数量的参数调用ff("abc", 1, 2, 3);

答案 2 :(得分:0)

答案 3 :(得分:0)

您可以像使用其他功能一样传递varargs功能。

这是一个简短的测试程序,演示了如何将varargs函数作为参数传递:

int bar(int x, ...) {
    /* In a real program, you would actually use the arguments beyond x */
    return x;
}

int foo(int (*baz)(int, ...)) {
    return bar(10, "ABC");
}

int main(void) {
    printf("%d\n", foo(bar));
    return 0;
}

它打印10,正如您所料。

N.B。你实际上不能将函数作为参数传递给C中的另一个函数 - 相反,你可以传递一个函数指针,它指向从中加载的实际函数可执行文件。这比函数式编程语言中函数的第一类状态弱,甚至比某些面向对象语言(如C#)中的委托状态弱。例如,您无法在C中动态创建函数。

答案 4 :(得分:0)

不确定。它们被称为“可变函数”。

1)只需使用“省略号”(“...”)作为函数原型

中的最后一个参数

2)为了让被调用函数“知道”传递了多少个参数,请使用宏“va_start”和“stdargs”中的朋友:

3)上面的1)和2)只是有一个具有变量#/ arguments的函数。您还可以使用带有变量#/ arguments的函数指针。做同样的事情 - 只需在函数原型中包含省略号(“...”),并在函数实现中使用“stdargs”。