与[问题]相关:How do you pass a function as a parameter in C?
在C中是否可以将具有可变数量参数的函数传递给另一个函数?如果是这样,有人可以指点我一些文件或填写我吗?感谢。
答案 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
参数,精确以此目的。 (当然可以使用固定数量的参数调用f
:f("abc", 1, 2, 3);
)
答案 2 :(得分:0)
http://www.lemoda.net/c/function-pointer-ellipsis/index.html似乎就是你所寻找的。 p>
答案 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”。